1、空間分配擔保的目的?
避免FullGC過於頻繁。
2、JDK 6 Update 24之前
在發生Minor GC之前,虛擬機必須先檢查老年代最大可用的連續空間是否大於新生代所有對象總空間,如果這個條件成立,那這一次Minor GC可以確保是安全的。如果不成立,則虛擬機會先查看-XX:HandlePromotionFailure參數的設置值是否允許擔保失敗(HandlePromotion Failure);如果允許,那會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小,如果大於,將嘗試進行一次Minor GC,儘管這次Minor GC是有風險的;如果小於,或者-XX:HandlePromotionFailure設置不允許冒險,那這時就要改爲進行一次FullGC。
3、在JDK 6 Update 24之後
(1)JDK 6 Update 24之後不再使用-XX:HandlePromotionFailure參數。
(2)JDK 6 Update 24之後的規則變爲只要老年代的連續空間大於新生代對象總大小或者歷次晉升的平均大小,就會進行Minor GC,否則將進行Full GC。
4、參考資料
《深入理解Java虛擬機:JVM 高級特性與最佳實踐(第3版)》