JVM-調優方案
調優
JVM調優主要就是調整下面兩個指標
停頓時間:垃圾收集器做垃圾回收中斷應用執行的時間。-XX:MaxGCPauseMillis
吞吐量:垃圾收集的時間和總時間的佔比:1/(1+n),吞吐量為1-1/(1+n)。-XX:GCTimeRatio=n
GC調優步驟
1.列印GC日誌
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log
Tomcat可以直接載入JAVA_OPTS變數裡
2.分析日誌得到關鍵性指標
3.分析GC原因,調優JVM引數
1.Parallel Scavenge收集器(預設)
分析parallel-gc.log
第一次調優,設定Metaspace大小:增大元空間大小-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
第二次調優,增大年輕代動態擴容增量(預設是20%),可以減少YGC:-XX:YoungGenerationSizeIncrement=30
比較下幾次調優效果:
吞吐量 | 最大停頓 | 平均停頓 | YGC | FGC |
---|---|---|---|---|
97.169% | 420 ms | 60.0 ms | 12 | 2 |
98.775% | 60.0 ms | 28.0 ms | 10 | 0 |
2.配置CMS收集器
-XX:+UseConcMarkSweepGC
分析gc-cms.log
3.配置G1收集器
-XX:+UseG1GC
分析gc-g1.log
young GC:[GC pause (G1 Evacuation Pause)(young)
initial-mark:[GC pause (Metadata GC Threshold)(young)(initial-mark) (引數:InitiatingHeapOccupancyPercent)
mixed GC:[GC pause (G1 Evacuation Pause)(Mixed) (引數:G1HeapWastePercent)
full GC:[Full GC (Allocation Failure)(無可用region)
(G1內部,前面提到的混合GC是非常重要的釋放記憶體機制,它避免了G1出現Region沒有可用的情況,否則就會觸發 FullGC事件。CMS、Parallel、Serial GC都需要通過Full GC去壓縮老年代並在這個過程中掃描整個老年代。G1的Full GC演算法和Serial GC收集器完全一致。當一個Full GC發生時,整個Java堆執行一個完整的壓縮,這樣確保了最大的空餘記憶體可用。G1的Full GC是一個單執行緒,它可能引起一個長時間的停頓時間,G1的設計目標是減少Full GC,滿足應用效能目標。)
檢視發生MixedGC的閾值:jinfo -flag InitiatingHeapOccupancyPercent 程序ID
調優:
第一次調優,設定Metaspace大小:增大元空間大小-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
第二次調優,新增吞吐量和停頓時間引數:-XX:GCTimeRatio=99 -XX:MaxGCPauseMillis=10
GC常用引數
堆疊設定
-Xss:每個執行緒的棧大小
-Xms:初始堆大小,預設實體記憶體的1/64
-Xmx:最大堆大小,預設實體記憶體的1/4
-Xmn:新生代大小
-XX:NewSize:設定新生代初始大小
-XX:NewRatio:預設2表示新生代佔年老代的1/2,佔整個堆記憶體的1/3。
-XX:SurvivorRatio:預設8表示一個survivor區佔用1/8的Eden記憶體,即1/10的新生代記憶體。
-XX:MetaspaceSize:設定元空間大小
-XX:MaxMetaspaceSize:設定元空間最大允許大小,預設不受限制,JVM Metaspace會進行動態擴充套件。
垃圾回收統計資訊
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
收集器設定
-XX:+UseSerialGC:設定序列收集器
-XX:+UseParallelGC:設定並行收集器
-XX:+UseParallelOldGC:老年代使用並行回收收集器
-XX:+UseParNewGC:在新生代使用並行收集器
-XX:+UseParalledlOldGC:設定並行老年代收集器
-XX:+UseConcMarkSweepGC:設定CMS併發收集器
-XX:+UseG1GC:設定G1收集器
-XX:ParallelGCThreads:設定用於垃圾回收的執行緒數
並行收集器設定
-XX:ParallelGCThreads:設定並行收集器收集時使用的CPU數。並行收集執行緒數。
-XX:MaxGCPauseMillis:設定並行收集最大暫停時間
-XX:GCTimeRatio:設定垃圾回收時間佔程式執行時間的百分比。公式為1/(1+n)
CMS收集器設定
-XX:+UseConcMarkSweepGC:設定CMS併發收集器
-XX:+CMSIncrementalMode:設定為增量模式。適用於單CPU情況。
-XX:ParallelGCThreads:設定併發收集器新生代收集方式為並行收集時,使用的CPU數。並行收集執行緒數。
-XX:CMSFullGCsBeforeCompaction:設定進行多少次CMS垃圾回收後,進行一次記憶體壓縮
-XX:+CMSClassUnloadingEnabled:允許對類元資料進行回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到達閥值的時候,才進行CMS回收
-XX:+CMSIncrementalMode:設定為增量模式。適用於單CPU情況
-XX:ParallelCMSThreads:設定CMS的執行緒數量
-XX:CMSInitiatingOccupancyFraction:設定CMS收集器在老年代空間被使用多少後觸發
-XX:+UseCMSCompactAtFullCollection:設定CMS收集器在完成垃圾收集後是否要進行一次記憶體碎片的整理
G1收集器設定
-XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:指定GC工作的執行緒數量
-XX:G1HeapRegionSize:指定分割槽大小(1MB~32MB,且必須是2的冪),預設將整堆劃分為2048個分割槽
-XX:GCTimeRatio:吞吐量大小,0-100的整數(預設9),值為n則系統將花費不超過1/(1+n)的時間用於垃圾收集
-XX:MaxGCPauseMillis:目標暫停時間(預設200ms)
-XX:G1NewSizePercent:新生代記憶體初始空間(預設整堆5%)
-XX:G1MaxNewSizePercent:新生代記憶體最大空間
-XX:TargetSurvivorRatio:Survivor填充容量(預設50%)
-XX:MaxTenuringThreshold:最大任期閾值(預設15)
-XX:InitiatingHeapOccupancyPercen:老年代佔用空間超過整堆比IHOP閾值(預設45%),超過則執行混合收集
-XX:G1HeapWastePercent:堆廢物百分比(預設5%)
-XX:G1MixedGCCountTarget:引數混合週期的最大總次數(預設8)