GC參數

一.串行收集器

特點:最古老 最穩定 效率高

缺點:可能會發生較長時間的停頓

參數:-XX:+UseSerialGC

新生代.老生代使用穿行回收

老生代複製算法.新生代標記壓縮算法

二.並行收集器

參數-XX:+UseParNewGC

影響:新生代串行.老年代並行(隻影響新生代)

複製算法,因爲是多線程的需要多核支持,多線程並行的複製算法

可以使用-XX:ParallelGCThreads限制線程數量

三.Parallel並行收集器

類似ParNew

新生代複製算法 老年代標記-壓縮算法

-XX:+UseParallelGC使用Parallel收集器+老年代串行

-XX:+UseParallelOldGC使用Parallel收集器+並行老年代

四.常用參數

參數-XX:PretenureSizeThreshold 

使用-XX:PretenureSizeThreshold=100000000 單位byte 當大於這個值的時候直接在老年代創建內存 以免在新生代浪費內存複製浪費時間GC.

參數-XX:SurvivorRatio=8 eden區和倖存代佔比是8:1 

年齡判斷

參數-XX:MaxTenuringThreshold=15 JVM給每個對象設置了一個年齡(Age)計數器,每個對象在Eden區出生並經歷過第一次MinorGC後仍然存活,並且被survivor所接納的話 那麼他的年齡就增加1歲,當他的年齡增加到一定的程度(默認是15歲)就會被晉升到老年代.當然關於這個歲數的閾值可以通過參數調整的---來自<<深入理解Java虛擬機>>

動態年齡判斷

爲了能更好的適應不同程序的內存狀況,虛擬機並不是永遠的要求對象的年齡必須達到了MaxTenuringThreshold才能晉升老年代,如果在survivor空間中相同的年齡所有對象大小的總和大於survivor空間的一半,那麼年齡大於或者等於該年齡的對象就直接晉級老年代了.---來自<<深入理解Java虛擬機>>

分配擔保策略

在發生Minor GC之前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代所有對象總空間。如果這個條件成立,那麼Minor GC可以確保是安全的。如果不成立,則虛擬機會查看HandlerPromotionFailure設置是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小。如果大於,將嘗試着進行一次Monitor GC,儘管這次GC是有風險的。如果小於,或者HandlerPromotionFailure設置不允許冒險,那這時也要改爲進行一次Full GC了。
上述所說的冒險到底是冒的什麼險呢?
前面提到過,新生代使用複製收集算法,但是爲了內存利用率。只使用其中一個Survivor空間來作爲輪換備份,因此當出現大量對象在Minor GC後仍然存活的情況(最極端的情況是內存回收之後,新生代中所有的對象都存活),就需要老年代進行分配擔保,把Survivor無法容納的對象直接進入老年代。老年代要進行這樣的擔保,前提是老年代本身還有容納這些對象的剩餘空間,一共有多少對象存活下來在實際完成內存回收之前是無法明確知道的,所以只好取之前每一次回收晉升到老年代對象容量的平均大小值作爲經驗值,與老年代的剩餘空間進行比較,決定是否進行Full GC來讓老年代騰出更多空間。
取平均值進行比較其實仍然是一種動態概率的手段,也就是說,如果某次Minor GC存活後的對象突增,遠遠高於平均值的話,依然會導致擔保失敗。如果出現HandlerPromotionFailure失敗,那就只好在失敗後重新發起一次FULL GC。雖然擔保失敗時繞的圈子是最大的,但大部分情況下都還是將HandlerPromotionFailure開關打開,避免Full GC過於頻繁。---來自<<深入理解Java虛擬機>>

 

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