-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等比例問題,採用動態算法調整分代大小。