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) 밖으로 밀어내는 것이 가장 좋은 참조 해제 방법입니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item 9. try-finally보다는 try-with-resource (0) | 2022.05.15 |
---|---|
[Effective Java] Item 8. finalizer와 cleaner 사용을 피하라. (0) | 2022.05.15 |
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2022.05.15 |
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용 (0) | 2022.05.14 |
[Effective Java] Item 4. 인스턴스화를 막으려면 private 생성자를 사용 (0) | 2022.05.14 |