블로그에 게시하는 위 글은 전체적인 내용 정리가 아닌
책을 읽으면서 새로 알게된 내용이나 제가 중요하다고 생각하는 내용을 정리한 글입니다.
코드는 깃허브에 있는 코드를 사용했습니다.
Java의 가비지 컬렉터만 믿고 메모리 관리에 신경을 안쓰면 안된다.
public class Stack {
...
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
...
}
위 코드는 스택의 pop() 메소드를 구현한 코드이다.
여기서 메소드에서 꺼낸 객체들을 가비지 컬렉터가 수거해가지 않는다는 문제점이 있다.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null
return result;
}
위와 같이 수정해야한다.
하지만 객체 참조를 직접 null 처리하는 일은 예외적인 경우여야한다.
자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항상 메모리 누수에 조심해야한다.
캐시도 메모리 누수를 일으키는 주범 중 하나이다.
WeakHashMap, LinkedHashMap.removeEldestEntry를 사용하여 필요없는 캐시를 삭제하거나 캐시의 유효 범위를 설정할 수 있다.
복잡한 캐시는 java.lang.ref 패키지를 활용한다.
콜백을 등록하고 명확히 해지하지 않으면 메모리 누수가 발생한다.
콜백을 약한 참조(weak reference)로 저장하자.
(ex. WeakHashMap에 키로 저장하면 된다.)