拋幾個(gè)問題:
1.誰進(jìn)行空間擔(dān)保?
JVM使用分代收集算法窘问,將堆內(nèi)存劃分為年輕代和老年代辆童,兩塊內(nèi)存分別采用不同的垃圾回收算法,空間擔(dān)保指的是老年代進(jìn)行空間分配擔(dān)保
2.什么是空間分配擔(dān)保惠赫?
在發(fā)生Minor GC之前把鉴,虛擬機(jī)會(huì)檢查老年代最大可用的連續(xù)空間是否大于新生代所有對(duì)象的總空間,
如果大于,則此次Minor GC是安全的
如果小于庭砍,則虛擬機(jī)會(huì)查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗场晶。如果HandlePromotionFailure=true,那么會(huì)繼續(xù)檢查老年代最大可用連續(xù)空間是否大于歷次晉升到老年代的對(duì)象的平均大小怠缸,如果大于诗轻,則嘗試進(jìn)行一次Minor GC,但這次Minor GC依然是有風(fēng)險(xiǎn)的揭北;如果小于或者HandlePromotionFailure=false扳炬,則改為進(jìn)行一次Full GC。
3.為什么要進(jìn)行空間擔(dān)保搔体?
是因?yàn)樾律捎?strong>復(fù)制收集算法恨樟,假如大量對(duì)象在Minor GC后仍然存活(最極端情況為內(nèi)存回收后新生代中所有對(duì)象均存活),而Survivor空間是比較小的疚俱,這時(shí)就需要老年代進(jìn)行分配擔(dān)保劝术,把Survivor無法容納的對(duì)象放到老年代。老年代要進(jìn)行空間分配擔(dān)保计螺,前提是老年代得有足夠空間來容納這些對(duì)象夯尽,但一共有多少對(duì)象在內(nèi)存回收后存活下來是不可預(yù)知的,因此只好取之前每次垃圾回收后晉升到老年代的對(duì)象大小的平均值作為參考登馒。使用這個(gè)平均值與老年代剩余空間進(jìn)行比較匙握,來決定是否進(jìn)行Full GC來讓老年代騰出更多空間。