- C++ 같은 언어로 코딩해본 경험이 있다면 알겠지만, 자바는 메모리를 직접 조작하는 언어가 아니라 굉장히 편합니다. 그래서 저 역시 자바를 사용하면서 딱히 메모리 관리에 신경쓰면서 코딩해본적이 없었으나, 책에서 나온 예시 코드를 보며 잘못 생각하고 있었다는 것을 알게 되었습니다.
코드 7-1을 살펴보면 Stack의 내부를 배열로 구현하면서 메모리 누수가 일어날 수 있는 코드를 보여주고 있습니다.
Stack의 활성영역을 size 변수를 기준으로만 구분(인덱스가 size보다 작은 영역이 활성영역) 지으면서, 기능적으로는 문제가 없어보이지만 실제로는 pop() 메소드를 호출할 때 메모리 누수가 일어나고 있습니다.
이에 대한 해결로
public object pop() {
if(size = 0) throw new EmptyStackException();
Object result = elements[--size];
element[size] = null;
return result;
}위와 같이 해당참조가 pop되면 그 영역을 null 처리하며, gc의 대상이 되도록 만드는 것입니다. 하지만 주의할 점은 이런 문제가 있다고 모든 객체를 다 쓰자마자 null 처리 하는 등의 불필요한 작업을 할 필요는 없다고 말하고 있습니다.
프로그래머가 메모리 누수를 고민해야되는 경우는 다음과 같습니다.
- 앞서 예제의 Stack 클래스처럼 자신의 메모리를 직접 관리하는 클래스를 구현하는 경우
- 코드 레벨에서 null 처리
- 캐시를 사용하는 경우
- WeakHashMap과 같은 컬렉션을 사용
- 리스너와 콜백을 사용하는 경우
- 콜백을 약한 참조로 저장하여 gc의 대상이 되도록