미니옵빠의 code stubs

Java Heap 분석 본문

Language/Java

Java Heap 분석

미니옵빠 2013. 6. 6. 12:31

구동 중인 Tomcat 의 Java Heap 분석 방법


* OutOfMemoryError (OOME) 시점에 Java Heap 메모리 덤프

* tomcat 의 구동 옵션에 "-XX:+HeapDumpOnOutOfMemoryError" 추가

* OOME 발생 시 tomcat 를 구동시킨 스크립트가 위치한 곳에 "java_pidPid.hprof" dump 파일이 생성됨


* 상시 Java Heap 메모리 덤프

* Java6 이상

* jmap 사용

1. ps 명령 등으로 Tomcat 의 Pid 를 확인

2. 아래 명령으로 dump 파일 생성

jmap -dump:format=b,file=heap.hprof [Pid]


* format=b 는 바이너리를 의미하며, file은 생성될 덤프파일 명이다. 이외 옵션은 특별히 사용할 필요가 없다.

* tomcat 동작 중으로 덤프가 불가할 경우, -F 옵션을 추가하여 강제로 덤프한다. 이 때 tomcat 의 응답이 중지되는 경우가 있으므로 반드시 서비스에서 노출 제외시킨 뒤 작업한다.


* 참고 URL: http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html


* Java5 이하

1. tomcat 의 구동 옵션에 "-XX:+HeapDumpOnCtrlBreak" 추가

2. ps 명령 등으로 Tomcat 의 Pid 를 확인

3. 아래 명령으로 dump 파일 생성

kill -3 [Pid]




Java Heap 분석 방법

* Eclipse의 Memory Analyzer (MAT)

* http://www.eclipse.org/mat/

* jhat 등 보다 UI 가 잘 되어 있어 분석 용이


* 사용 방법

1. MAT를 싱행

2. File > Open Heap Dump 로 분석할 heap dump 파일 (.hprof) 을 load

3. Getting Started Wizard 에서 "Leak Suspects Report" 를 선택

4. 분석된 결과 화면에서, 상단의 "Open Dominator Tree for entire heap" 아이콘을 선택.

5. 메모리를 많이 차지하고 있는 객체 위주로 노출되므로, Retained Heap 항목을 참고하여 메모리를 많이 소비하는 문제 객체를 찾아 개선