GC 에 너무 의존한 나머지 메모리 관리를 하지 않는 경우가 생긴다.
public class Stack {
...
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
...
}
위의 Stack 의 pop() 메서드에서는 참조 해제(null 처리)를 해주지 않아서 메모리 누수가 발생한다.
각 원소의 참조가 더 이상 필요없는 시점에서는 참조 해제가 필요하다.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null
return result;
}
위와 같이 null 처리를 통해 객체 참조를 해제시켜주면서 메모리를 관리해야한다.
모든 객체를 쓰자마자 해제하는 방식은 바람직하지 않다.
객체 참조를 null 처리하는 일은 예외적인 경우여야 한다.
메모리를 직접 관리하는 클래스라면 프로그래머는 항상 메모리 누수에 주의해야 한다.
캐시도 메모리 누수를 일으키는 주범이다.
WeakHashMap
,LinkedHashMap.removeEldestEntry
를 사용해서 필요없는 캐시를 삭제하거나 캐시의 유효 범위를 설정할 수 있다.
콜백을 등록하고 명확히 해제하지 않으면 메모리 누수가 발생한다.
콜백을 약한 참조(weak reference)로 저장하면 GC 가 즉시 수거해간다.
(e.g WeakHashMap에 키로 저장하면 된다)