[Effective Java] 2 - item 7
item7 다 쓴 객체 참조를 해제하라.
- 자바에는 가비지 컬렉터가 존재하지만, 이것이 메모리 관리에 신경을 쓰지 않아도 된다는 뜻은 아니다.
자기 메모리를 직접 관리하는 클래스의 메모리 누수에 주의하라.
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e) {
ensureCapacity();
elements[size++] = e;
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
이 Stack을 사용하는 프로그램을 오래 실행하다 보면, 점차 GC활동과 메모리 사용량이 늘어나 결국 성능이 저하될 것이다.
캐시
객체를 사용하지 않게 되었는데, 이 객체가 캐시에 있는 경우 메모리 누수가 일어날 수 있다.
캐시 외부에서 키를 참조하는 동안만 엔트리가 살아 있는 캐시가 필요한 상황이라면 WeakHashMap
을 사용하라.
Map<Object, Object> cache = new WeakHashMap<>();
리스너 / 콜백
클라이언트가 콜백을 등록만 하고 해지하지 않는다면, 이것이 쌓이게 될 것이다. 이 경우 콜백을 약한 참조로 저장하면 가비지 컬렉터가 즉시 수거해간다. (WeakHashMap
의 키로 저장)
Leave a comment