자바는 GC(Garbage Collector)가 다 쓴 객체를 알아서 회수한다 → 그럼에도 메모리 관리는 신경써야 한다! → 메모리 누수 관리 필요!
e.g. 스택 구조
OutofMemoryError
발생으로 예기치 않게 종료되기도 한다.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];
}
/**
* 원소를 위한 공간을 적어도 하나 이상 확보한다.
* -> 배열 크기를 늘려야 할 때마다 대략 2배씩 확장
*/
private void ensureCapacity() {
if (elements.length == size) {
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
메모리 확장/회수에서 발생한다.
obsolete reference
: 더이상 쓰지 않는 참조가비지 컬렉션 언어에서 메모리 누수를 찾기가 매우 까다롭다