1. 程式人生 > >JVM GC日記和記憶體DUMP引數配置

JVM GC日記和記憶體DUMP引數配置

JVM GC日誌和記憶體DUMP引數配置
在JVM出現記憶體溢位或洩露時,為便於排查和定位,需要JVM的啟動上增加相應的引數。主要是GC日誌和記憶體DUMP引數。詳細如下。 
1.GC日誌和記憶體DUMP引數配置 

    本文引數配置基於各廠商的JDK 6.0版本,低版本或高版本的引數有可能不同。各廠商JVM GC日誌和記憶體DUMP引數配置如下: 
(1)Oracle  JVM
-Xloggc:${目錄}/managed1_gc.log 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=${目錄} 
(2)HP JVM
-Xverbosegc:file=${目錄}/mananged1_gc.log 


-XX:+HeapDumpOnOutOfMemoryError  -XX:+HeapDumpOnCtrlBreak   
-XX:HeapDumpPath=${目錄} 
(3)IBM JVM 
-XverboseGClog: ${目錄}/mananged1_gc.log 
-Xdump:heap:events=user,file=${目錄}/pid%uid%pid.phd 

2.GC日誌引數說明 
2.1.Oracle JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 -Xloggc:${目錄}/managed1_gc.log。 
2、引數說明 
   (1)在叢集環境下,建議按照節點名命名GC日誌檔案,例如節點1的名稱為managed1,則日誌檔案命名為managed1_gc.log。 

   (2)備註:如果只有-verbose:gc引數,gc日誌會輸出到控制檯上,如果-verbose:gc和-Xloggc:filename引數共存,以-Xloggc為準。-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 可以增加,但是增加後產生的gc日誌用HPjemeter工具不能識別,其中-XX:+PrintGC引數和單獨的-verbose:gc或者單獨的-Xloggc的輸出是一樣的,都是簡要資訊。 
2.2.HP JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 -Xverbosegc:file=${目錄}/mananged1_gc.log。 

2、引數說明 
   (1)在叢集環境下,建議按照節點名命名GC日誌檔案,例如節點1的名稱為managed1,則日誌檔案命名為managed1_gc.log。 
   (2)HP JVM的GC日誌檔案生成時會自動增加程序號(PID),例如:managed1_gc.log.2252,其中2252為Java程序ID。 
2.3.IBM JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 -XverboseGClog:${目錄}/mananged1_gc.log。 
2、引數說明 
   在叢集環境下,建議按照節點名命名GC日誌檔案,例如節點1的名稱為managed1,則日誌檔案命名為managed1_gc.log。 

3.記憶體DUMP引數說明 
3.1.Oracle JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 
-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=${目錄}。 
2、引數說明 
   (1)-XX:+HeapDumpOnOutOfMemoryError引數表示當JVM發生OOM時,自動生成DUMP檔案。 
   (2)-XX:HeapDumpPath=${目錄}引數表示生成DUMP檔案的路徑,也可以指定檔名稱,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof。如果不指定檔名,預設為:java_<pid>_<date>_<time>_heapDump.hprof。 
   (3)Oracle JVM的6.0版本去掉了-XX:+HeapDumpOnCtrlBreak引數,如果需要產生DUMP檔案,請採用jmap命令,命令列格式如下: 
       jmap  -dump:format=b,file=managed1_heapdump.hprof  <pid> 
   其中managed1_heapdump.hprof表示生成的DUMP檔名稱,pid表示Java程序號。 
3.2.HP JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 
-XX:+HeapDumpOnOutOfMemoryError  -XX:+HeapDumpOnCtrlBreak 
-XX:HeapDumpPath=${目錄}。 
2、引數說明 
   (1)-XX:+HeapDumpOnOutOfMemoryError引數表示當JVM發生OOM時,自動生成DUMP檔案。 
   (2)-XX:HeapDumpPath=${目錄}引數表示生成DUMP檔案的路徑,也可以指定檔名稱,如果不指定檔名,預設檔案示例如下:java_pid2821.hprof.1313372696928,其中2821為Java程序號,1313372696928為自動生成的數字。 
   (3)-XX:+HeapDumpOnCtrlBreak引數表示可以通過kill  -3  <pid>根據需要產生DUMP檔案。 
3.3.IBM JVM 
1、配置方法 
   在JAVA_OPTIONS變數中增加 
-Xdump:heap:events=user,file=${目錄}/pid%uid%pid.phd。 
2、引數說明 
   (1)-Xdump:heap:events=user,file=${目錄}/pid%uid%pid.phd表示可以根據需要通過kill  -3  <pid>產生DUMP檔案,%uid和%pid為變數。生成的檔名稱示例:pidtestuser303118.phd,其中testuser為uid,303118為pid;IBM JVM採用kill -3同時會生成另外一個javacore檔案,檔案示例:javacore.20110815.173356.303118.0002.txt。
(2)IBM JVM當發生OOM時會自動生成DUMP檔案,無需額外的引數配置。

生成dump檔案

     通過jvm引數--XX:-HeapDumpOnOutOfMemoryError可以讓JVM在出現記憶體溢位是Dump出當前的記憶體轉儲快照;
     或者,用jmap生產dump檔案,win通過工作管理員檢視tomcat的程序pid,linux用ps命令檢視程序pid,然後用jmap命令(Java5:jmap -heap:format=b <pid>;Java6:jmap -dump:format=b,file=HeapDump.bin <pid>)。

     我這裡使用的是,我一生產環境專案,執行一段時間大概3周的樣子,就會報OutOfMemoryError。(ps:這個專案出現這種情況已經有好長一段時間了,我們之前的做法是定期的重啟tomcat,沒有去分析它的原因。)JDK64位主要引數:-Xmx3078M -Xms3078M -XX:PermSize=1024M -XX:MaxPermSize=1024M,記憶體還是蠻大的。