자바는 GC(Garbage Collector)가 다 쓴 객체를 알아서 회수한다 → 그럼에도 메모리 관리는 신경써야 한다! → 메모리 누수 관리 필요!

e.g. 스택 구조

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);
			}
		}
}

위 코드에서 발생하는 누수는 어디서 날까?

메모리 확장/회수에서 발생한다.

가비지 컬렉션 언어에서 메모리 누수를 찾기가 매우 까다롭다

해결방법