一、Throughput收集器(吞吐量)
-XX:+UseParallelGC
-XX:+UseParallelOldGC
*參數調整:通過調整堆大小,減少GC停頓時間,增大吞吐量
增強堆大小可以減少Full GC頻率,但卻會增加停頓時間
1.手動調整
-Xmn?
-Xms?
-XX:NewRatio=N
手動指定堆內存大小和代空間比例,一般要多次試驗
2.自動參數調整
-XX:MaxGCPauseMillis=N 可接受最大停頓時間
-XX:GCTimeRatio=N 可接受GC時間占比(目標吞吐量) 吞吐量=1-1/(1+N)
步驟:
1.MaxGCPauseMillis優先級高,JVM會自動調整堆大小和代空間值,以期滿足MaxGCPauseMillis
2.當MaxGCPauseMillis滿足后,JVM會增大堆大小,直到滿足GCTimeRatio
3.當MaxGCPauseMillis和GCTimeRadio都滿足后,JVM會盡可能以最小堆大小來實現這兩個指標參數
Throughput一般不考慮響應時間,所以一般不設置-XX:MaxGCPauseMillis
一般吞吐量在95%以上就算比較好的了,對于可用內存很少的環境可以降低指標
?
?
二、CMS收集器(響應時間)
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
CMS收集器會對年輕代進行并發GC, 會有stw(stop-the-world)
CMS收集器會對老年代進行并發GC, CMS
如果有必要,CMS會發起單線程的Full GC, 這個操作十分耗時
Full GC原因:
并發模式失效:新生代發生GC時,老年代沒有足夠內存容納晉升對象
晉升失敗:老年代雖然有足夠容納晉升對象的內存,但內存都是碎片,導致晉升失敗
*參數調整:避免并發模式失效和晉升失敗
-XX:+UseCMSInitiatingOccupancyOnly 根據Old內存使用閾值決定何時CMS, 默認是false,會用更復雜的算法決定何時CMS
-XX:CMSInitingOccupancyFraction=N default N=70,老年代內存使用70%時就發生CMS
N設置太大,容易并發模式失效;N太小,CMS過于頻繁,而CMS也會導致stop-the-world
-XX:ConGCThreads=N GC的線程會100%占用CPU,如果發生并發模式失敗,而N還小于CPU核心數,此時可以增加N。
如果沒有發生并發模式失敗,此時可以減少N,以讓應用程序有更多CPU執行
Perm持久代GC調優
持久代內存滿了會引發Full GC
持久代GC調優主要是讓持久代也進行CMS收集
-XX:+CMSPermGenSweepingEnable 使持久代使用CMS收集器
-XX:+CMSClassUnloadingEnable 使持久代能真正釋放不再被使用的類。默認是不會釋放類的元數據的
增量式CMS:普通CMS線程會占用100%的cpu負載,增量式CMS會讓出一定CPU負載給應用線程
這適合在單核CPU使用,顯然已經沒啥用處了