1. 程式人生 > 其它 >JVM-調優方案

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

比較下幾次調優效果:

吞吐量最大停頓平均停頓YGCFGC
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)