본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 7. 다 쓴 객체 참조를 해제하라

자바의 가비지 컬렉션(garbage collection) 메커니즘이 자동으로 메모리 관리를 해주더라도, 더 이상 사용하지 않는 객체에 대한 참조를 계속 유지하는 것은 메모리 누수(memory leak)를 일으킬 수 있다. 특히, 컬렉션 객체 같은 경우는 개발자가 명시적으로 객체 참조를 해제하지 않으면, 의도치 않게 메모리 누수가 발생할 수 있다.

 

스택 구현에서의 메모리 누수 방지 예시 : 

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();
        Object result = elements[--size];
        elements[size] = null; // 다 쓴 참조 해제
        return result;
    }

    /**
     * 스택이 커질 필요가 있을 때 크기를 늘려준다.
     */
    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

여기서 핵심은 pop 메서드에서 스택에서 제거된 객체(Object result = elements[--size])에 대한 참조를 null로 설정하여 명시적으로 해제하는 부분이다. 이제 가비지 컬렉터가 필요할 때 이전에 스택에 저장되었던 객체를 회수할 수 있다. 만약

pop 메서드에서 객체 참조를 null로 설정하지 않는다면 스택이 그 객체에 대한 참조를 계속 유지하게 된다. 더 이상 사용되지 않는 객체임에도 불구하고 가비지 컬렉터가 회수하지않아 장시간 동안 어플이 실행될 경우 메모리 누수가 일어난다. 

 

결론 : 다 쓴 객체 참조를 해제하는 것은 메모리 관리와 애플리케이션 성능에 있어 중요한 사항이다.