JVM的GC日誌的主要參數

 

-Xmn1024m -Xms2500m -Xmx2500m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxDirectMemorySize=256m -XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8 -XX:+ExplicitGCInvokesConcurrent -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/www/logs/gc-%%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/www/logs -Djava.io.tmpdir=/var/www/tmp
-Xmn1024m -Xms2500m -Xmx2500m -XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFraction=70 -XX:MaxDirectMemorySize=256m 
-XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8 
-XX:+ExplicitGCInvokesConcurrent -XX:MetaspaceSize=128m 
-XX:MaxMetaspaceSize=256m -XX:-OmitStackTraceInFastThrow 
-XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-Xloggc:/var/www/logs/gc-%%t.log 
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=10m -XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/var/www/logs -Djava.io.tmpdir=/var/www/tmp

 一:理解GC日誌格式,讀GC日誌的方法

1:開啓日誌

 

-verbose:gc 

-XX:+PrintGCDetails 

-XX:+PrintGCDateStamps

-Xloggc:/path/gc.log

-XX:+UseGCLogFileRotation  啓用GC日誌文件的自動轉儲 (Since Java)

-XX:NumberOfGClogFiles=1  GC日誌文件的循環數目 (Since Java)

-XX:GCLogFileSize=1M  控制GC日誌文件的大小 (Since Java)

-XX:+PrintGC包含-verbose:gc

-XX:+PrintGCDetails //包含-XX:+PrintGC

只要設置-XX:+PrintGCDetails 就會自動帶上-verbose:gc和-XX:+PrintGC

-XX:+PrintGCDateStamps/-XX:+PrintGCTimeStamps 輸出gc的觸發時間

 

二:參數配置和理解

1:參數分類和說明

jvm參數分固定參數和非固定參數

1):固定參數

如:-Xmx,-Xms,-Xmn,-Xss.

2):非固定參數

如:

-XX:+<option> 啓用選項

-XX:-<option> 不啓用選項

-XX:<option>=<number> 給選項設置一個數字類型值,可跟單位,例如 128k, 2g

-XX:<option>=<string> 給選項設置一個字符串值,例如-XX:HeapDumpPath=./dump.log

 

2:JVM可設置參數和默認值

1):-XX:+PrintCommandLineFlags

打印出JVM初始化完畢後所有跟最初的默認值不同的參數及它們的值,jdk1.5後支持.

線上建議打開,可以看到自己改了哪些值.

2):-XX:+PrintFlagsFinal

顯示所有可設置的參數及"參數處理"後的默認值。參數本身只從JDK6 U21後支持

可是查看不同版本默認值,以及是否設置成功.輸出的信息中"="表示使用的是初始默認值,而":="表示使用的不是初始默認值

如:jdk6/7 -XX:+MaxTenuringThreshold 默認值都是15,但是在使用CMS收集器後,jdk6默認4 , jdk7默認6.

 

三:JVM內存區域理解和相關參數

一圖勝千言,直接上圖

1):物理分代圖.

 

物理分代是除G1之外的JVM 內存分配方式,jvm 通過-Xmx,-Xmn/newRatio等參數將jvm heap劃分成物理固定大小,對於不同場景比例應該設置成多少很考驗經驗.

一篇JVM CMS優化講解的非常好的文章: how-tame-java-gc-pauses

 

2) 邏輯分代圖(G1)

邏輯分代是以後的趨勢(PS:jdk8連perm都不區分了。), 不需要使用者在糾結Xms/Xmn,SurvivorRatio等比例問題,採用動態算法調整分代大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章