[Effective Java 3/e] 아이템 7 - 다 쓴 객체 참조를 해제하라
아이템 7 - 다 쓴 객체 참조를 해제하라
메모리 누수가 일어나는 위치는 어디인가
public class Stack {
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
}
제대로 구현한 pop 메서드
public class Stack {
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // 다 쓴 참조 해제
returnresult;
}
}
- 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체뿐 아니라 그 객체가 참조하는 모든 객체를 회수해가지 못한다.
- 해당 참조를 다 썼을 때 null 처리(참조 해제) 하면 된다.
메모리 누수의 주범 세가지
- 다 쓴 참조
- null 처리 필요
- 캐시
- 외부에서 키를 참조하는 동안만 엔트리가 살아 있는 캐시가 필요하면 WeakHashMap 사용
- 쓰지 않는 엔트리 청소
- LinkenHashMap -> removeEldestEntry 메서드 사용
- 리스너 혹은 콜백
- 클라이언트가 콜백 등록만 하고 해지 하지 않으면 콜백은 계속 쌓임
- 콜백을 약한 참조(weak reference)로 저장하면 가비지 컬렉터가 즉시 수거함.
- WeakHashMap 에 키로 저장
- 콜백을 약한 참조(weak reference)로 저장하면 가비지 컬렉터가 즉시 수거함.
- 클라이언트가 콜백 등록만 하고 해지 하지 않으면 콜백은 계속 쌓임