G1調優常用參數

-XX:MaxGCPauseMillis:暫停時間,默認值200ms。這是一個軟性目標,G1會盡量達成,如果達不成,會逐漸做自我調整。對於Young GC來說,會逐漸減少Eden區個數,減少Eden空間那麼Young GC的處理時間就會相應減少;對於Mixed GC,G1會調整每次Choose Cset的比例,默認最大值是10%,當然每次選擇的Cset少了,所要經歷的Mixed GC的次數會相應增加。同時減少Eden的總空間時,就會更加頻繁的觸發Young GC,也就是會加快Mixed GC的執行頻率,因爲Mixed GC是由Young GC觸發的,或者說藉機同時執行的。頻繁GC會對對應用的吞吐量造成影響,每次Mixed GC回收時間太短,回收的垃圾量太少,可能最後GC的垃圾清理速度趕不上應用產生的速度,那麼可能會造成串行的Full GC,這是要極力避免的。所以暫停時間肯定不是設置的越小越好,當然也不能設置的偏大,轉而指望G1自己會盡快的處理,這樣可能會導致一次全部併發標記後觸發的Mixed GC次數變少,但每次的時間變長,STW時間變長,對應用的影響更加明顯。


-XX:G1HeapRegionSize:Region大小,若未指定則默認最多生成2048塊,每塊的大小需要爲2的冪次方,如1,2,4,8,16,32,最大值爲32M。Region的大小主要是關係到Humongous Object的判定,當一個對象超過Region大小的一半時,則爲巨型對象,那麼其會至少獨佔一個Region,如果一個放不下,會佔用連續的多個Region。當一個Humongous Region放入了一個巨型對象,可能還有不少剩餘空間,但是不能用於存放其他對象,這些空間就浪費了。所以如果應用裏有很多大小差不多的巨型對象,可以適當調整Region的大小,儘量讓他們以普通對象的形式分配,合理利用Region空間。


新生代比例:新生代比例有兩個數值指定,下限:-XX:G1NewSizePercent,默認值5%,上限:-XX:G1MaxNewSizePercent,默認值60%。G1會根據實際的GC情況(主要是暫停時間)來動態的調整新生代的大小,主要是Eden Region的個數。最好是Eden的空間大一點,畢竟Young GC的頻率更大,大的Eden空間能夠降低Young GC的發生次數。但是Mixed GC是伴隨着Young GC一起的,如果暫停時間短,那麼需要更加頻繁的Young GC,同時也需要平衡好Mixed GC中新生代和老年代的Region,因爲新生代的所有Region都會被回收,如果Eden很大,那麼留給老年代回收空間就不多了,最後可能會導致Full GC。


併發GC線程數:通過 -XX:ConcGCThreads來指定,默認是-XX:ParallelGCThreads/4,也就是在非STW期間的GC工作線程數,當然其他的線程很多工作在應用上。當併發週期時間過長時,可以嘗試調大GC工作線程數,但是這也意味着此期間應用所佔的線程數減少,會對吞吐量有一定影響。


並行GC線程數:通過 -XX:ParallelGCThreads來指定,也就是在STW階段工作的GC線程數,其值遵循以下原則:
① 如果用戶顯示指定了ParallelGCThreads,則使用用戶指定的值。
② 否則,需要根據實際的CPU所能夠支持的線程數來計算ParallelGCThreads的值,計算方法見步驟③和步驟④。
③ 如果物理CPU所能夠支持線程數小於8,則ParallelGCThreads的值爲CPU所支持的線程數。這裏的閥值爲8,是因爲JVM中調用nof_parallel_worker_threads接口所傳入的switch_pt的值均爲8。
④ 如果物理CPU所能夠支持線程數大於8,則ParallelGCThreads的值爲8加上一個調整值,調整值的計算方式爲:物理CPU所支持的線程數減去8所得值的5/8或者5/16,JVM會根據實際的情況來選擇具體是乘以5/8還是5/16。
比如,在64線程的x86 CPU上,如果用戶未指定ParallelGCThreads的值,則默認的計算方式爲:ParallelGCThreads = 8 + (64 - 8) * (5/8) = 8 + 35 = 43。


被納入Cset的Region的存活空間佔比閾值:通過 -XX:G1MixedGCLiveThresholdPercent指定,不同版本默認值不同,有65%和85%。在全局併發標記階段,如果一個Region的存活對象的空間佔比低於此值,則會被納入Cset。此值直接影響到Mixed GC選擇回收的區域,當發現GC時間較長時,可以嘗試調低此閾值,儘量優先選擇回收垃圾佔比高的Region,但此舉也可能導致垃圾回收的不夠徹底,最終觸發Full GC。


觸發全局併發標記的老年代使用佔比:通過-XX:InitiatingHeapOccupancyPercent指定,默認值45%,也就是老年代佔堆的比例超過45%。如果Mixed GC週期結束後老年代使用率還是超過45%,那麼會再次觸發全局併發標記過程,這樣就會導致頻繁的老年代GC,影響應用吞吐量。同時老年代空間不大,Mixed GC回收的空間肯定是偏少的。可以適當調高IHOP的值,當然如果此值太高,很容易導致年輕代晉升失敗而出發Full GC,所以需要多次調整測試。


觸發Mixed GC的堆垃圾佔比:通過-XX:G1HeapWastePercent指定,默認值5%,也就是在全局標記結束後能夠統計出所有Cset內可被回收的垃圾佔整對的比例值,如果超過5%,那麼就會觸發之後的多輪Mixed GC,如果不超過,那麼會在之後的某次Young GC中重新執行全局併發標記。可以嘗試適當的調高此閾值,能夠適當的降低Mixed GC的頻率。


每輪Mixed GC回收的Region最大比例:通過-XX:G1OldCSetRegionThresholdPercent指定,默認10%,也就是每輪Mixed GC附加的Cset的Region不超過全部Region的10%,最多10%,如果暫停時間短,那麼可能會少於10%。一般這個值不需要額外調整。
一個週期內觸發Mixed GC最大次數:通過-XX:G1MixedGCCountTarget指定,默認值8。也就是在一次全局併發標記後,最多接着8此Mixed GC,也就是會把全局併發標記階段生成的Cset裏的Region拆分爲最多8部分,然後在每輪Mixed GC裏收集一部分。這個值要和上一個參數配合使用,8*10%=80%,應該來說會大於每次標記階段的Cset集合了。一般此參數也不需額外調整。


G1爲分配擔保預留的空間比例:通過-XX:G1ReservePercent指定,默認10%。也就是老年代會預留10%的空間來給新生代的對象晉升,如果經常發生新生代晉升失敗而導致Full GC,那麼可以適當調高此閾值。但是調高此值同時也意味着降低了老年代的實際可用空間。


謹慎使用Soft Reference。如果SoftReference過多,會有頻繁的老年代收集。-XX:SoftRefLRUPolicyMSPerMB參數,可以指定每兆堆空閒空間的軟引用的存活時間,默認值是1000,也就是1秒。可以調低這個參數來觸發更早的回收軟引用。如果調高的話會有更多的存活數據,可能在GC後堆佔用空間比會增加。 對於軟引用,還是建議儘量少用,會增加存活數據量,增加GC的處理時間。


-XX:MaxTenuringThreshold:晉升年齡閾值,默認值15。一般新生對象經過15次Young GC會晉升到老年代,巨型對象會直接分配在老年代,同時在Young GC時,如果相同age的對象佔Survivors空間的比例超過 -XX:TargetSurvivorRatio的值(默認50%),則會自動將此次晉升年齡閾值設置爲此age的值,所有年齡超過此值的對象都會被晉升到老年代,此舉可能會導致老年代需要不少空間應對此種晉升。一般這個值不需要額外調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章