1. 개요

본 문서는 자바 메모리 누수에 대한 내용을 다룬다.


2. GC 그래프 분석

그래프 패턴을 분석한다. (PMAT 등을 사용한다) 그래프가 우상향 패턴이라면 의심 가능하다. 하지만 표본이 충분해야 한다. 누수는 대개 서서히 진행되므로 충분히 많은 기간의 GC 로그가 필요하다.

만약 분석 툴을 사용할 수 없는 상황이라면 GC 로그 파일을 차근차근 분석하는 접근법도 좋다. 중요한 것은 Full GC 이후에 Old Generation에 잔류하고 있는 량이다. Full GC에도 불구하고 여전히 많은 객체가 남아있다면 의심 가능하다.


3. 덤프, 히스토그램 생성

최근의 JDK에는 jmap 유틸리티가 포함되어 있다. (JDK 5 이하는 없을 것이다) jmap을 이용하면 덤프를 생성하고 히스토그램을 받아볼 수 있다. 덤프는 주기적으로 수차례 생성해야 할 가능성이 크다. 히스토그램은 -histo:live 옵션을 쓰면 된다. 

jmap에 대해서는 자바 메모리 분석을 위한 jmap이란? 문서에 보다 자세히 기술되어 있다.


4. 덤프 분석

역시 최근의 JDK에는 jhat 유틸리티가 포함되어 있다. 만약 jhat으로 분석할 수 없는 경우 사제 분석 툴을 써보자. [맛], [마트], [엠에이티] 등으로 불리는 이클립스 MAT가 좋다. 

분석시 자주 사용되는 용어에 대해 알아보자.

4-1. Shallow Heap

  • 1개 객체(Leading set)가 점유하고 있는 메모리 크기

4-2. Retained Heap

  • 객체가 GC 될 때 Shallow Heap 크기 + 함께 제거되는 모든 객체가 사용하는 메모리 크기(총합)
  • 즉, GC 될 때 확보되는(=해제되는) 총 메모리 크기

4-3. Outgoing references

  • 선택한 객체가 참조하고 있는 객체 출력
  • 즉 멤버 변수 출력

4-4. Incoming references

  • 선택한 객체를 참조하고 있는 객체나 클래스 출력
  • 이 객체가 GC되기 위해서는 reference가 제거되어야 한다.