JVM에는 GC(가비지 컬렉터)가 있지만, 그렇다고 해서 메모리 관리에 신경쓰지 않아도 되는 것은 아니다!
public class Stack {
private static final int DEFAULT_INITIAL_CAPACITY = 16;
private Obejct[] elements;
private int size = 0;
public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(final 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);
}
}
메모리 누수
문제가 존재한다!
OutOfMemoryError
를 일으켜 프로그램이 종료되기도 한다.그렇다면, 위의 코드에서 메모리 누수는 어디서 일어날까?
스택이 커졌다가 줄어들었을 때 스택에서 꺼내진 객체들을 가비지 컬렉터가 회수하지 않는다.
가비지 컬렉션 언어에서는 메모리 누수를 찾기가 까다롭다.
→ 해법은 간단하다! → 해당 참조를 다 썼을 때 null
처리 하자.
public Object pop() {
if (size == 0) {
return new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null; // 다 쓴 참조 해제
return result;
다 쓴 참조를
null
처리하면 다른 이점도 따라온다!
null
처리한 참조를 실수로 사용하려 하면 프로그램은 즉시 NullPointerException
을 던지며 종료된다.<aside>
💡 하지만, 모든 객체를 일일이 쓰자마자 null
처리를 할 필요는 없다!
</aside>
null
처리하는 경우는 예외적인 경우여야 한다.