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

Eunkyung·2022년 5월 11일
0

Java

목록 보기
19/21

다 쓴 객체 참조를 해제하라

GC의 메모리 누수

GC가 메모리 관리를 자동으로 해준다고 해도 메모리 관리에 신경쓰지 않으면 안된다.

대표적으로 스택의 pop 메서드 처리 과정에서 메모리 누수가 발생한다.

스택에서 꺼내진 객체들은 가비지 컬렉션의 대상이 되지 않기 때문에 메모리에 그대로 남아있게 되며, 성능이 저하된다.

이러한 문제는 해당 참조를 다 썼을 때 null 처리하여 해결할 수 있다.

null 처리를 통해 메모리 낭비를 방지할 수 있게 되었다. 추가로 null 처리한 참조를 실수로 사용하려 하면 프로그램은 즉시 NullPointerException을 던지며 종료된다.

예외적인 null 처리

다 쓴 참조를 null 처리하는 일은 예외적인 경우여야 하며, 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이 가장 좋은 방법이다.

스택은 자기 메모리를 직접 관리하고 배열의 활성 영역에 속한 원소만 사용되기 때문에 비활성 영역은 GC가 알 수 없다. 따라서, 비활성 영역이 되는 순간 null 처리로 GC에 알려야 한다.

캐시

객체 참조를 캐시에 넣고 잊어버린 경우 메모리 누수의 원인이 된다. 이는 WeakHashMap을 사용해 캐시를 만들어 다 쓴 엔트리는 즉시 자동으로 제거하여 해결한다.

리스너, 콜백

클라이언트가 콜백을 등록만 하고 해지하지 않는 경우 계속 쌓이게 된다. 콜백을 약한 참조로 저장하면 메모리 누수를 방지할 수 있다.

출처

  • 이펙티브 자바
profile
꾸준히 하자

0개의 댓글