Sun JDK
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
명령으로 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
- SendSignal.exe
- kill -3
- 설정
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 발생시 자동으로 생성
- 설정
SIGQUIT (kill -3 )
- 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
- SendSignal.exe
- kill -3
- 설정
jmap 사용(JDK 1.6이상)
- 별도로 JVM 옵션에 명시할 필요없이 JDK에 포함되어 있는 jmap을 사용해 heap dump를 생성할 수 있다. Windows 버전은 JDK 1.5 버전에 jmap이 포함되어 있지 않으므로 사용할 수 없다.
- heap dump 생성
- jmap -heap:format=b
(JDK 1.5) - jmap -dump:format=b,file=
(JDK 6)
- jmap -heap:format=b
- heap dump 생성
- Eugene's comment : 사용해본 결과 상당히 느리다.
HP JDK
SIGQUIT (kill -3 )
- 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
- kill -3
OutOfMemoryError 발생 시 자동으로 heap dump 생성
- Sun JDK처럼 JVM 옵션에 -XX:+HeapDumpOnOutOfMemoryError를 설정하면 OutOfMemoryError 발생 시에 heap dump를 현재 실행 디렉터리에 생성한다.
IBM JDK
SIGQUIT (kill -3 )
- OS 환경 변수에 둘 중 하나를 아무 값이나 줘서 설정한다.
- 설정
export IBM_HEAPDUMP=<any_value> export IBM_HEAP_DUMP=<any_value>
- heap dump 생성
- kill -3
- kill -3
OutOfMemoryError 발생 시 자동으로 heap dump 생성
- IBM은 기본적으로 생성하도록 되어 있고 대신 끄는 옵션을 제공한다.
- 끄고 싶으면 OS 환경변수 상에 IBM_HEAPDUMP_OUTOFMEMORY=FALSE and IBM_JAVADUMP_OUTOFMEMORY=FALSE 라고 주면 된다.
MISC
- 종종 대용량 heap분석을 위해서는 메모리를 충분히 할당해야 열리는 dump들이 존재한다. 이를 위해서는 64bit machine에서 java를 실행하여야 몇기가 단위의 메모리를 충분히 할당할 수 있으며 다음과 같은 server를 WAS실에서 보유하고 있다. 자세한 계정 정보의 경우 장봉재/김수옥/오세봉 연구원한테 문의바람
- 192.168.1.108/telnet 23port/was3s
- 192.168.1.109/telnet 23port/was4s
- 위 머신에 gui로 접속을 하기 위해서는 Xmanager를 설치해야 한다. 단, license가 없으므로 trial version을 설치하고 기간이 만료되면 날짜를 바꾸어 주면 된다.
- download url: http://www.netsarang.co.kr/download/main.html
- heapdump 파일이 너무 클 경우 java 를 실행할 때 -d64 옵션을 주고 -Xmx를 아주 크게 주고 하면 된다.
- 참고: 64bit jdk의 경우는 max heap size가 physical memory size에 관계없이 무한으로 줄 수 있다.
[출처] How to JVM Heap Dump|작성자 무한무심
- 참고: 64bit jdk의 경우는 max heap size가 physical memory size에 관계없이 무한으로 줄 수 있다.


ga414.zip
HPjmeter4.1 User Guide.pdf