[WAS] Heap Dump 분석하기
JVM에서 Thread Dump는 현재 수행중인 쓰레드에 대한 호출경로 StackTrace를 보기 위한 것이고 Heap Dump는 현재 Heap에서 점유되고 있는 객체들에 대한 조사를 위하여 필요한 내역이다
1. Thread Dump 수행
- 명령 : kill -3 <pid>
- <pid> 는 JVM의 process ID 이다
- Thread Dump 내역을 통하여 Thread ID와 호출에 대한 추적을 할 수 있다
Full Java thread dump with locks info
"ZipFile Lock Reaper" Id=1826 in TIMED_WAITING on lock=java.util.TaskQueue@76a7850e
at java.lang.Object.wait(Native Method)
at java.util.TimerThread.mainLoop(Timer.java:509)
at java.util.TimerThread.run(Timer.java:462)
Locked synchronizers: count = 0
"ajp-0.0.0.0-8009-20" Id=1323 in WAITING on lock=org.apache.tomcat.util.net.AprEndpoint$Worker@12a2bc0f
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1989)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2014)
at java.lang.Thread.run(Thread.java:662)
Locked synchronizers: count = 0
"ajp-0.0.0.0-8009-19" Id=1321 in RUNNABLE (running in native)
at org.apache.tomcat.jni.Socket.recvbb(Native Method)
at org.apache.coyote.ajp.AjpAprProcessor.readt(AjpAprProcessor.java:1072)
at org.apache.coyote.ajp.AjpAprProcessor.readMessage(AjpAprProcessor.java:1163)
at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:368)
at org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpAprProtocol.java:425)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2036)
at java.lang.Thread.run(Thread.java:662)
... 중략 ..
2. Heap Dump 수행
- JVM GC 블로깅에서 Old영역을 많이 사용할 경우 일반적으로 사용되지 않는 객체들이 Reference되어 GC되지 않고 남아 있을 가능성이 높다. 이때는 어떤 객체들이 많이 점유되고 있는지 조사할 필요가 있다
- 즉, Old 영역을 많이 점유하고 있으면 Full GC가 자주 오래동안 발생할 수 있으므로 업무 응답시간에 문제 또는 장애를 일으킬 소지가 있다
- JDK6 명령 : jmap -dump:format=b,file=<fileName> <PID>
- jmap은 JDK_HOME/bin 에 포함되어 있음
3. Heap Dump 분석
- Eclipse Memory Analyzer Tool (mat) 을 이용한다
- 독립 프로그램 다운로드 : Heap Dump Size는 몇 Gbytes 씩 되므로 64bit OS 에서 64bit mat 를 다운로드 받는다
- MemoryAnalyzerTool.ini 파일의 초기값 설정을 Heap Dump 파일 사이즈에 따라 적절히 한다
+ 내 경우 : -Xms2048m -Xmx8192m (Heap Dump file size 6Gbytes 일때)
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
- mat에서 Heap Dump 파일을 로딩한다. 이때 파일 확장자는 .hprof 여야 한다.
6Gbytes 로딩에 대략 수시간이 소요되니 인내심이 필요 하다
- mat 통하여 Heap Dump 분석할 때 로컬 메모리가 부족할 경우 Swap Size를 확장하여 준다 (스왑 설정하기)
<참조>
- Eclipse Memory Analyzer Tool Download
- JHat 분석툴, JVisualVM 분석툴 (jdk1.6제공)