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,記憶體還是蠻大的。