吞吐量是指,應用程序的TPS: 每秒多少次事務,QPS: 每秒多少次查詢等性能指標。
吞吐量調優就是減少垃圾收集器消耗的CPU周期數,從而將更多的CPU周期用於執行應用程序。
CMS包括Minor GC所帶來的開銷應該小於10%,如果垃圾收集的開銷在3%或更少,說明通過調優吞吐量,提升性能的空間就極其有限了。
可用的調優方法如下:
1. 增大新生代空間,以降低Minor GC頻率,減少CPU周期占用;
2. 增加老年代空間,以降低CMS頻率,並可以減少老年代內存碎片;
3. 優化CMS周期的啟動條件,盡可能在較晚的時候進行;
總的來說,就是減少垃圾收集占用的CPU周期。
這裡說的ParallelGC是指開啟了下面兩個JVM參數
-XX:+UseParallelGC
-XX:+UseParallelOldGC
對ParallelGC調優的目標是盡可能避免發生Full GC,這就需要優化對象老化頻率,可以調整Survivor空間實現對對象老化的優化。
使用ParallelGC時,垃圾收集的開銷應小於5%,如果已經減少到1%甚至更少,那基本上就已經達到了極限。
ParallelGC默認可以自動調整Survivor空間,大部分應用用自動調整已經可以,對要求比較高的應用就需要關閉自動調整,進行手動調整。
為JVM添加下面兩個參數,只針對ParallelGC有用:
-XX:-UseAdaptiveSizePolicy //關閉自適應調整 -XX:+PrintAdaptiveSizePolicy //打印詳細Survivor空間占用日志
如下面日志:
2016-12-11T16:44:03.653+0800: 5.042: [GC (Allocation Failure) AdaptiveSizePolicy::update_averages: survived: 10464720 promoted: 1096456 overflow: true
survived:“TO”Survivor空間占用大小;
promoted: 新生代提升至老年代的對象大小;
overflow:是否有Survivor空間的對象溢出到老年代;
從上面的日志可以看出,Minor GC後新生代存活對象大小10M,因為沒有設置-XX:TargetSurvivorRatio,默認Survivor空間占用比率為50%,
所以Survivor空間應為20M。
找到穩定態下Full GC之間所有Minor GC中最大的存活對象大小,然後就可以調整Survivor空間大小。
原JVM參數如下:
-Xmx1024m –Xms1024m –Xmn50m -XX:SurvivorRatio=3
可以計算出:原Survivor空間:10M,原Eden空間:30M
現在增大Survivor空間到20M
保證Eden空間不變,則新生代大小為70M;
70M / (SurvivorRatio + 2)=20M,所以SurvivorRatio=1.5
保證老年代空間不變,則Java堆大小調整為1044M
所以最後JVM參數為:
-Xmx1044m -Xms1044m -Xmn70m -XX:SurvivorRatio=1.5
如果Java堆大小已經不能再增大,可以計算下Minor GC後,存活對象的最小值、最大值、平均值,如果不存在大幅波動,
可以嘗試提高Survivor空間的占用百分比-XX:TargetSurvivorRatio=<n>,其默認為50%。
-XX:ParallelGCThreads
並行垃圾收集器的線程數,建議收集線程數設置的小於默認值,否則大量GC線程會影響應用性能