JVM內(nèi)存管理—內(nèi)存回收—對象在不同分區(qū)上分配

以下為對象在內(nèi)存中分配的規(guī)則,這些規(guī)則并不是百分之百固定的,其細(xì)節(jié)取決于正在使用的垃圾收集策略,當(dāng)然還有與虛擬機(jī)的內(nèi)存相關(guān)參數(shù)設(shè)置有關(guān)。

1. 對象優(yōu)先在Eden分配

一般,對象在新生代Eden區(qū)中分配,當(dāng)Eden區(qū)沒有足夠空間進(jìn)行分配時(一般不會將新生對象直接放入Survivor中,它只保存上一次GC還存活的對象),虛擬機(jī)將發(fā)生一次Minor GC(當(dāng)Eden空間不足,就會發(fā)生對新生代的GC)。

2. 大對象直接進(jìn)入老年代

所謂的大對象是指,需要大量連續(xù)內(nèi)存空間的Java對象,最經(jīng)典的大對象就是那種很長的字符串以及數(shù)組。經(jīng)常出現(xiàn)大對象容易導(dǎo)致內(nèi)存還有不少空間時就提前出發(fā)垃圾收集。所以應(yīng)當(dāng)盡量避免短命大對象的使用。

3. 長期存活的對象將進(jìn)入老年代

對象的年齡:虛擬機(jī)給每個對象定義了一個對象年齡計數(shù)器,如果對象在Eden出生并經(jīng)過第一次的MinorGC后仍然存活,并且能被Survivor區(qū)中每“熬過”一次Minor GC,年齡就增加一歲,當(dāng)它的年齡增加到一定程度(默認(rèn)為15歲),就會被晉升到老年代中。

4. 動態(tài)對象年齡判定

為了更好的適應(yīng)不同程度的內(nèi)存狀況,虛擬機(jī)并不是永遠(yuǎn)地要求對象的年齡必須達(dá)到閥值才能晉升老年代,如果Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象就可以直接進(jìn)入老年代,無須等到閥值中要求的年齡。

5. 空間分配擔(dān)保

  1. 在發(fā)生MinorGC之前,虛擬機(jī)會先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象的總空間,如果這個條件成立,那么Minor GC 可以確保是安全的。
  2. 如果不成立,則虛擬機(jī)會查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗。如果允許,那么會繼續(xù)查找老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試著進(jìn)行一次Minor GC,盡管這次MinorGC是有風(fēng)險的
  3. 如果小于,或者HandlePromotionFailure設(shè)置不允許冒險,那這時也要改為進(jìn)行一次Full GC。

觸發(fā)Full GC的五種情況

  1. 直接調(diào)用System.gc()
  2. 老年代空間不足
  3. 永久代空間滿

Java 8 中已經(jīng)移除了永久代,改用元空間。元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制。
Minor GC 會清理新生代(滿或者無法分配大對象),Major GC是清理永久代。Full GC是清理整個堆空間——包括新生代和老年代。

  1. 在使用CMS策略對老年代進(jìn)行垃圾回收時
  • promotion failed: 進(jìn)行Minor GC時,Survivor 放不下上一次存活的對象,對象只能放入老年代,而此時老年代也放不下造成的。
  • concurrent mode failure:在執(zhí)行CMS GC的過程中同時有對象要放入老年代,而此時老年代空間不足造成的。
  1. 統(tǒng)計得到的Minor GC 晉升到老年代的平均大小大于老年代的剩余空間

HotSpot 為了避免由于新生代對象晉升到老年代導(dǎo)致老年代空間不足的現(xiàn)象,在進(jìn)行Minor GC時,做了有一個判斷,如果之前統(tǒng)計所得的MInor GC 晉升到老年代的平均大小大于老年代的剩余空間,那么就直接觸發(fā) Full GC。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容