참조: Effective Java 2nd Edition Item 6. Eliminate obsolute object references

C나 C++처럼 메모리 관리를 직접 하다가 GC를 사용하는 자바로 넘어오면 편해진거 같지만, 조심하지 않으면 메모리 부족 현상이 나타날 수 있다.

public Object pop() {
  if (size == 0)
    throw new EmptyStackException();
  return elements[--size];
}

배열에서 필요없는 객체 레퍼런스를 가지고 있기 떄문에, 여러 객체를 담고 빼고 하다보면 계속 쌓여서 결국엔 메모리 부족 현상이 발생한다.

public Object pop() {
  if (size == 0)
    throw new EmptyStackException();
  Object result = elements[--size];
  elements[size] = null; // Eliminate obsolete reference
  return result;
}

명시적으로 null 로 설정하는 방법은 예외적인 경우에 한해서 사용하는게 좋다. 객체 레퍼런스를 제거하는 가장 좋은 방법은 scope를 이용하는 것이다. 자연스럽게 제거 되도록..

또 다른 메모리 부족 주요 원인은 캐시.

객체 레퍼런스를 캐시에 넣어두고 삭제하는 걸 깜빡하는 경우가 있다. 대안책으로 WeakHashMap을 사용하는 것이다.

Remember that WeakHashMap is useful only if the desired lifetime of cache
entries is determined by external references to the key, not the value.

흠.. Weak Reference를 사용하는 HashMap인것 같은데, 잘 몰겠다. API를 봐야겠네.

메모리 부족 세 번째 주요 원인은 리스너나 콜백.

콜백을 등록하고 나서 나중에 해지할 때 제대로 하지 않아서 문제 발생. 콜백을 GC 하는 최선의 방법은 WeakHashMap을 사용해서 콜렉션에 오직 weak reference만 담는 것이다.

메모리 부족 문제는 힙 프로파일러(heap profiler)를 사용해서 디버깅 하지 않는 이상 찾아내기 힘들다.