鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ Java GC 分配擔(dān)保時為何需要檢查老年代最大可用的連續(xù)空間?

Java GC 分配擔(dān)保時為何需要檢查老年代最大可用的連續(xù)空間?

看到一段話:

在發(fā)生Minor GC之前,虛擬機(jī)會先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果這個條件成立,那么Minor GC可以確保是安全的。如果不成立,則虛擬機(jī)會查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗。如果允許,那么會繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小

為什么是要連續(xù)的空間大于新生代所有對象總空間?我怎么覺得是老年代連續(xù)的空間大于新生代的最大對象需要的空間,而不是“新生代所有對象總空間”? 所有的新生代對象必須要放在連續(xù)的空間上嗎?

而這句話“繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小”,這個平均大小是指單個對象的平均大小還是所有對象之和的平均大?。?/p>

回答
編輯回答
不將就

這句話出自<<深入理解Java虛擬機(jī)>>第二版,你需要看完這本書的垃圾收集算法,才知道為什么.簡單的說你錯在哪呢,如果新生代所有的對象都在鏈上不可回收呢?

確定哪些對象可以回收通常有兩種算法,一種是引用計數(shù),一種是可達(dá)性分析算法.HotSpot采用的就是第二種.第二種會通過一些稱為GC Root的對象.可作為GC Roots的對象包括下面幾種:

  • 虛擬機(jī)棧(棧幀中的本地變量表)中引用的對象。
  • 方法區(qū)中類靜態(tài)屬性引用的對象
  • 方法區(qū)中常量引用的對象。
  • 本地方法棧中JNI(即一般說的Native方法)引用的對象

這些引用會形成一條鏈,凡是在鏈上的說明還在使用,不可回收.

2017年3月15日 08:24
編輯回答
空白格

問題一,既然是擔(dān)保,則要保證100%成功。如果老年代有很多空閑區(qū),但都非常小,小到不足以分配一個對象,那么及時老年代有很大空間,也是做不了擔(dān)保的,必須是連續(xù)。此外,新生代的對象可能會在某一次集體提升到老年代,為了擔(dān)保,老年代空閑必須大于整個年輕代大小。
綜合,老年代最大連續(xù)空閑空間需大于年輕代總空間。

問題二,所有提升到老年代對象大小的總和。這里的平均只是平均了每次ygc時,提升的年輕代對象大小總和。

2017年3月25日 18:56