달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Heap Dump 생성

java 2008. 9. 18. 10:59

http://blog.naver.com/clotho95/140048453696

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

Posted by marryjane
|