1. Sun JDK
1) HPRof 사용
JDK 버전에 따라 JVM 옵션에 -Xrunhprof:heap=dump,format=b,doe=n (JDK 1.4) 또는 -agentlib:hprof=heap=dump,format=b,doe=n (JDK 1.5)을 명시하고, 실행시에 Control-break 또는 kill -3 <pid> 명령으로 heap dump를 생성할 수 있다. Windows 환경이라면 SendSignal.exe를 사용하면 된다.
하지만 오버헤드가 너무 커서 운영환경에서 사용하기에는 무리가 따른다. 이 옵션없이 JBoss를 기동하면 30초면 뜨는데, 옵션을 키면 무려 3분 30초가 걸렸다.
* 설정
- -Xrunhprof:heap=dump,format=b,doe=n (JDK 1.4)
- -agentlib:hprof=heap=dump,format=b,doe=n (JDK 1.5)
* heap dump 생성
- kill -3 <pid>
- SendSignal.exe <pid>
2) OutOfMemoryError 발생 시 자동으로 heap dump
JVM 옵션에 -XX:+HeapDumpOnOutOfMemoryError를 설정하면 OutOfMemoryError 발생 시에 heap dump를 현재 실행 디렉터리에 생성한다. JBoss의 경우는 $JBOSS_HOME/bin 디렉터리이다. heap dump가 생성되는 경로를 지정하려면 -XX:HeapDumpPath를 설정해준다.
Sun JDK 1.4.2_12, 1.5.0_7, 그리고 HP 1.4.2_11 이후 버전에서 지원된다.
* 설정
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=/path
* heap dump 생성
- OutOfMemoryError 발생시
3) SIGQUIT (kill -3 <pid>)
JVM 옵션에 -XX:HeapDumpOnCtrlBreak를 설정하면 SIGQUIT signal로 heap dump를 생성할 수 있다. JDK 1.5.0_14 부터 지원된다. 하지만, Windows와 Linux 버전의 JDK 1.5.0_14는 버그로 인해 "/"가 포함된 파일명으로 heap dump를 생성하려고해 No such file or directory라는 에러를 내며 heap dump가 생성되지 않는다. Solaris 버전은 테스트를 못해봤는데 설마 동작하지 않을까 싶다.
* 설정
- -XX:HeapDumpOnCtrlBreak
* heap dump 생성
- kill -3 <pid>
- SendSignal.exe <pid>
4) jmap 사용
별도로 JVM 옵션에 명시할 필요없이 JDK에 포함되어 있는 jmap을 사용해 heap dump를 생성할 수 있다. Windows 버전은 JDK 1.5 버전에 jmap이 포함되어 있지 않으므로 사용할 수 없다.
* heap dump 생성
- jmap -heap:format=b <pid> (JDK 1.5)
- jmap -dump:format=b,file=<filename> <pid> (JDK 6)
2. HP JDK
1) SIGQUIT (kill -3 <pid>)
HP의 경우 JVM 옵션에 -XX:+HeapDump를 설정해 SIGQUIT signal로 heap dump를 생성할 수 있다. 기본적으로 text 형식으로 저장되는데 binary 형식이 필요하면 _JAVA_BINARY_HEAPDUMP 환경변수를 설정하면 된다. 이 방법 외에도 Sun JDK처럼 -XX:+HeapDumpOnCtrlBreak를 설정하면 binary heap dump를 생성한다. JVM 옵션을 변경하기 싫으면 _JAVA_HEAPDUMP 환경변수를 설정해도 된다.
* 설정
- -XX:+HeapDump 또는 -XX:HeapDumpOnCtrlBreak
- export _JAVA_HEAPDUMP=1
* heap dump 생성
- kill -3 <pid>
2) OutOfMemoryError 발생 시 자동으로 heap dump 생성
Sun JDK처럼 JVM 옵션에 -XX:+HeapDumpOnOutOfMemoryError를 설정하면 OutOfMemoryError 발생 시에 heap dump를 현재 실행 디렉터리에 생성한다.
참고자료
http://java.sun.com/javase/6/webnotes/trouble/other/troubleshooting-j2se5.html
http://java.sun.com/javase/6/webnotes/trouble/
http://docs.hp.com/en/5992-1918/ch01s27.html
http://www.latenighthacking.com/projects/2003/sendSignal/
http://forum.java.sun.com/thread.jspa?threadID=681590&messageID=3975318
http://blogs.sun.com/alanb/entry/heap_dumps_are_back_with
[출처] Heap Dump 생성|작성자 소프
'java' 카테고리의 다른 글
자바 디자인 패턴 1 - Iterator (0) | 2008.09.24 |
---|---|
The Java XML Validation API - IBM developerworks (0) | 2008.09.19 |
VM 분석 : Chapter 1 Performance - 2 / -Xrunprof 옵션 (0) | 2008.09.17 |
java.lang.OutOfMemoryError - OOME (0) | 2008.09.17 |
java.lang.OutOfMemoryError 의 case별 원인 파악및 해결방안 정리 (0) | 2008.09.17 |