簡單解釋 記憶體分配的一種機制,Young區空間容納不了對象時會把對象放到Old區,所以稱之為Old區給Young區的空間做擔保。繼續聯想。。。。java堆記憶體會使用誰來做空間擔保呢? 官方解釋 在發生Minor GC之前,虛擬機必須先檢查老年代最大可用的連續空間是否大於新生代所有對象總 空間,如果這 ...
簡單解釋
記憶體分配的一種機制,Young區空間容納不了對象時會把對象放到Old區,所以稱之為Old區給Young區的空間做擔保。繼續聯想。。。。java堆記憶體會使用誰來做空間擔保呢?
官方解釋
在發生Minor GC之前,虛擬機必須先檢查老年代最大可用的連續空間是否大於新生代所有對象總 空間,如果這個條件成立,那這一次Minor GC可以確保是安全的。如果不成立,則虛擬機會先查看- XX:HandlePromotionFailure參數的設置值是否允許擔保失敗(Handle Promotion Failure);如果允 許,那會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小,如果大 於,將嘗試進行一次Minor GC,儘管這次Minor GC是有風險的;如果小於,或者-XX: HandlePromotionFailure設置不允許冒險,那這時就要改為進行一次Full GC。
---- 《深入理解java虛擬機》
偽代碼
if(老年代最大可用的連續空間 < 新生代所有對象的總空間) {
if(HandlePromotionFailure == true) {
if(老年代最大可用連續空間 > 歷次晉升到老年代的對象的平均大小) {
YGC(); // 嘗試進行一次 YGC,但這次 YGC 依然是有風險的
} else {
FGC();
}
} else {
FGC();
}
} else {
YGC(); // 此次 YGC 安全
}