티스토리 툴바




https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=HPJMETER



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

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

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)
  • 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

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

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을 설치하고 기간이 만료되면 날짜를 바꾸어 주면 된다.
  • heapdump 파일이 너무 클 경우 java 를 실행할 때 -d64 옵션을 주고 -Xmx를 아주 크게 주고 하면 된다.
    • 참고: 64bit jdk의 경우는 max heap size가 physical memory size에 관계없이 무한으로 줄 수 있다.