[이펙티브 자바] 아이템7

hyng·2022년 11월 23일
0

이펙티브 자바

목록 보기
7/13

다 쓴 객체 참조를 해제하라


다음 코드에서 메모리 누수가 발생하는 지점은 어디일까?

바로 pop() 메서드이다. elements 배열이 pop한 객체에 대해 여전히 참조를 가지고 있기 때문에 gc대상이 되지 못하고 이 각 객체들이 참조하는 모든 객체 또한 gc에 의해 회수 되지 못한다.
그리고 이는 잠재적으로 성능에 악영향을 줄 수 있다.

이 문제를 해결하는 가장 간단한 방법은 다 쓴 객체 (=pop 한 객체)에 대해 elements에 null 처리하는 것이다.

하지만 이 방법은 필요 이상으로 프로그램을 지저분하게 만든다.

다 쓴 참조를 해제하는 가장 좋은 방법은 그 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다.

다만 Stack 클래스처럼 자기 메모리를 직접 관리하는 경우는 null 값을 저장함으로써 해당 객체를 더 이상 사용하지 않는다는 것을 가비지 컬렉터에게 알려야 한다.

예시 외에도 다음의 경우에 메모리 누수를 주의하는 것이 좋다.

캐시 메모리

캐시 역시 메모리 누수를 일으키는 주범이다. 외부에서 키를 사용하는 동안만 엔트리가 살아있는 캐시가 필요한 경우 WeakHashMap을 사용해서 캐시를 만들자.
혹은 쓰지 않는 엔트리를 청소해 주는 백그라운드 스레드(ScheduledThreadPoolExecutor 같은)를 사용하거나 캐시에 새 엔트리를 추가할 때 부가 작업을 처리하도록 해줄 수 있다.

리스너 혹은 콜백

콜백을 등록만 하고 해제해 주지 않는다면 콜백은 계속 쌓여만 갈 것이다.
이런 경우 WeakHashMap을 사용하여 콜백을 weak reference로 저장하는 방법으로 다 쓴 콜백에 대해 gc 대상이 되도록 할 수 있다.

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글