IT_Programming/Java

Java Real-time Heap Dump 생성

JJun ™ 2011. 6. 22. 14:24


  출처:  http://blog.naver.com/goacts29/50032897558


 

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 사용(JDK 1.6이상)

      별도로 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