자바의 가비지 컬렉션(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로 설정하지 않는다면 스택이 그 객체에 대한 참조를 계속 유지하게 된다. 더 이상 사용되지 않는 객체임에도 불구하고 가비지 컬렉터가 회수하지않아 장시간 동안 어플이 실행될 경우 메모리 누수가 일어난다.
결론 : 다 쓴 객체 참조를 해제하는 것은 메모리 관리와 애플리케이션 성능에 있어 중요한 사항이다.
'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 아이템 9. try-finally보다는 try-with-resources를 사용하라 (0) | 2024.03.11 |
---|---|
[이펙티브 자바] 아이템 8. finalizer와 cleaner 사용을 피하라 (0) | 2024.03.11 |
[이펙티브 자바] 아이템 6. 불필요한 객체 생성을 피하라 (0) | 2024.03.11 |
[이펙티브 자바] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.03.11 |
[이펙티브 자바] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.03.11 |