less than 1 minute read

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