拋幾個問題:
1.誰進行空間擔保?
JVM使用分代收集算法,將堆內存划分為年輕代和老年代,兩塊內存分別采用不同的垃圾回收算法,空間擔保指的是老年代進行空間分配擔保
2.什么是空間分配擔保?
在發生Minor GC之前,虛擬機會檢查老年代最大可用的連續空間是否大於新生代所有對象的總空間,
如果大於,則此次Minor GC是安全的
如果小於,則虛擬機會查看HandlePromotionFailure設置值是否允許擔保失敗。如果HandlePromotionFailure=true,那么會繼續檢查老年代最大可用連續空間是否大於歷次晉升到老年代的對象的平均大小,如果大於,則嘗試進行一次Minor GC,但這次Minor GC依然是有風險的;如果小於或者HandlePromotionFailure=false,則改為進行一次Full GC。
3.為什么要進行空間擔保?
是因為新生代采用
復制收集算法,假如大量對象在Minor GC后仍然存活(最極端情況為內存回收后新生代中所有對象均存活),而Survivor空間是比較小的,這時就需要老年代進行分配擔保,把Survivor無法容納的對象放到老年代。
老年代要進行空間分配擔保,前提是老年代得有足夠空間來容納這些對象,但一共有多少對象在內存回收后存活下來是不可預知的,
因此只好取之前每次垃圾回收后晉升到老年代的對象大小的平均值作為參考。使用這個平均值與老年代剩余空間進行比較,來決定是否進行Full GC來讓老年代騰出更多空間。