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제공)
'Middleware, Cloud > WAS' 카테고리의 다른 글
[WAS] GC 모니터링 및 튜닝하기 (0) | 2013.05.21 |
---|---|
[JBoss] Thread Pool 종류 및 Port 정보 (0) | 2013.05.15 |
[JBoss] deploy 와 deployer 디렉토리 내역 상세 설명 (0) | 2012.11.26 |
[JBoss-Configuration] 하이퍼소닉 삭제 (0) | 2012.10.25 |
[JBoss-Configuration] JMS 설정 (0) | 2012.10.25 |