[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 에 키로 저장