본문 바로가기

개발/자바

(6)
무지성으로 final 쓰지 않기 문제 제기 코드 리뷰 과정에서 immutable 을 아는지란 질문을 받았다. 처음엔 final 키워드를 사용해 불변으로 만드는 것이라 생각했었다. 하지만, 컬렉션을 사용할 때 immutable을 제대로 보장하지 않는다는 걸 알게 됐다. 한 줄로 요약하면 뒷문이 열려있었다고 보면 된다. immutable을 보장하는 방법은 다음과 같다. 클래스의 하위 클래스화 방지 setter 메서드 사용 X 외부 참조를 취하는 생성자 관리 final 객체 참조를 반환하는 Getter 처리 모든 필드에 private final 사용 왜 final을 쓰나? 1. gc 오버헤드를 감소시킬 수 있다. 오버헤드가 주제가 아니라 더 다루진 않는다. 링크: https://docs.oracle.com/javase/tutorial/ess..
자바가 엔진단에서 어떻게 동작할까 큰 흐름은 다음과 같다. JIT 컴파일러 (Just-In Time Compiler) 인터프리터에서 읽은 코드를 또 읽으면서 생기는 부하 문제가 있다. 해결 수단으로 메서드를 다시 읽지 않고 JIT 호출을 통해 기계어를 바로 읽는다. 관련 기술인 JRockit 기준 스레드를 모니터링해 자주 사용되는 메서드의 기계어를 저장해놓는다. 자주 사용되는 메서드라 판별될 때 까진 인터프리터가 바이트코드를 한 줄씩 해석하는 문제가 있다. 즉, 재시작 등에서 발생하는 콜드 미스의 비용이 매우 크다. 네이티브 컴파일러와 차이? C의 경우 .exe, .elf 같은 형태로 디스크에 저장되지만 Java의 JIT는 JVM의 메서드 영역에 저장된다. 즉, 휘발성이다. 메서드 영역에 어떤 형태로 저장됐는지는 관련 문서가 없어 알 수..
JPA 연관 관계에서 set과 list 차이 문제 제기 인터넷에서 연관 관계에 대한 코드를 찾아보면 List가 아닌 Set을 사용하는 경우가 있어 무슨 차이인지 궁금했다. 이 글은 아래 사항들을 알고 있단 가정 하에 썼다. - List와 Set 연산의 시간 복잡도 - OneToMany 연관관계 mapping 속성들 5.0.8 이전의 hibernate hibernate문서를 보면 연관 관계를 맺을 땐, List가 더 나은 성능을 보인다 했다. 하지만, 이 때 HHH-5855 이슈가 생겼다. CASCADE를 MERGE, PERSIST, ALL 셋 중 하나로 준 경우 연관관계의 주인이 아닌 쪽에 객체를 생성하면, INSERT 쿼리가 두 번 발생해 중복이 생겼다. 예를 들자면, Parent와 Child는 1:N의 관계를 가진다고 하자. 연관관계의 주인인 ..
Serialization (+ JPA) 보호되어 있는 글입니다.
java stream이 for-loop보다 느린 이유 수정 이력 2022.12.27 맞춤법 수정 및 참조 문제 항목 추가 서론 프로그래머스에서 다른 사람들의 코드를 보면 stream을 사용한 코드들을 종종 보는데 정석적인 방식에 비해 몇 배 느린데도 숏 코딩+ 간결해 보인단 이유로 좋아요를 꽤 받는 걸 보니 이렇게 짜는 게 정말 좋은 건지 궁금해서 알아보게 됐다. 정확한 속도 측정에 관해서는 Reference 항목의 3번째 링크의 동영상을 보면 된다. https://programmers.co.kr/learn/courses/30/lessons/42578 위 문제에서 stream을 사용하지 않을 때와 사용했을 때 속도 차이다. 왼쪽이 stream을 사용하지 않은 코드 오른쪽이 stream을 사용한 코드다. stream이란? java 8부터 나온 함수형 inte..
자바 gc 약한 세대 가설 (weak generational hypothesis) 가비지 컬렉터의 역할 1. 메모리 할당 2. 참조된 객체가 메모리에 남아있는지 확인 3. 런타임 때 더 이상 도달할 수 없는 개체의 메모리 회수 가비지 컬렉터가 실행되는 상황 1. 전체 힙 또는 하위 요소가 임계값 이상이 될 때2. 요청한 메모리만큼 힙에서 할당할 수 없는 경우 Compaction 가비지 컬렉터가 실행되고 난 후에는 여유 공간들이 연속돼있지 않고, 여러 chunk로 남는다. 이는 큰 개체에 대한 할당을 어렵게 만들기 때문에 가비지 컬렉터는 다양한 압축 방법을 지원한다. 가비지 컬렉터의 성능 지표 1. 처리량(Throughput) : 충분히 긴 시간동안 가비지 콜렉터 수행 시간을 제외한 런타임 비율 2. overhead : 1번의 반대. 가비지 컬렉터의 수행 시간 비율 3. pause ti..