吞吐量是指,應用程序的TPS: 每秒多少次事務,QPS: 每秒多少次查詢等性能指標。html
吞吐量調優就是減小垃圾收集器消耗的CPU週期數,從而將更多的CPU週期用於執行應用程序。java
CMS包括Minor GC所帶來的開銷應該小於10%,若是垃圾收集的開銷在3%或更少,說明經過調優吞吐量,提高性能的空間就極其有限了。性能
可用的調優方法以下:優化
1. 增大新生代空間,以下降Minor GC頻率,減小CPU週期佔用;ui
2. 增長老年代空間,以下降CMS頻率,並能夠減小老年代內存碎片;spa
3. 優化CMS週期的啓動條件,儘量在較晚的時候進行;命令行
總的來講,就是減小垃圾收集佔用的CPU週期。線程
這裏說的ParallelGC是指開啓了下面兩個JVM參數日誌
-XX:+UseParallelGC
-XX:+UseParallelOldGCcode
對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線程會影響應用性能
-XX:+AggressiveOpts | 自動優化,但有可能不太穩定 |
-XX:+DoEscapeAnalysis | 逃逸分析 |
-XX:+UseBiasedLocking | 偏向鎖 |
-XX:+UseLargePages | 大頁面支持 |