스터디/이펙티브 자바

[Effective Java] Item 7. 다 쓴 객체를 참조 해제하라.

📝 작성 : 2022.05.15  ⏱ 수정 : 
728x90
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에서 pop에서 꺼내진 객체들을 GC는 회수하지 않습니다. 즉, 이 스택이 객체들의 다 쓴 참조(앞으로 다시 쓰지 않을 참조, obsolete reference)를 여전히 갖고 있다는 말입니다.

해결법

public Object pop() {
    if (size == 0) {
        throw new EmptyStackException();
    }
    Object result = elements[--size];
    elements[size] = null;
    return result;
}

null로 객체 참조를 해제

null로 객체를 참조하면 메모리 누수 관련 이점외에 또다른 이점이 있습니다. 만약 null처리 한 참조를 사용하려하면 NullPointerException을 던집니다. 하지만 객체 참조를 null처리 하는 일은 예외적인 경우여야 합니다.

그럼 어떻게 하나요?

변수를 유효 범위(scope) 밖으로 밀어내는 것이 가장 좋은 참조 해제 방법입니다.

반응형