java 內存分配策略

1 對象優先在新生代Eden區中進行分配,當Eden區沒有足夠空間進行分配時,虛擬機進行一次Minor GC

2 大對象直接進入老年代
所謂大對象就是需要大量連續內存空間的java對象,最典型的大對象就是很長的字符串以及數組。

3 長期存活的對象進入老年代
虛擬機爲每個對象定義了對象年齡的計數器,如果對象在Eden區出生,並經過第一次Minor GC後仍然存活,並且能夠被Survivor容納的化,將被移動到Survivor空間中,並且對象的年齡設置爲1。對象每經過一次Minor GC,年齡就增加1歲,當它的年輛增到一定程度(默認是15歲),就將會被晉升到老年代中。

4 動態對象年齡判定
虛擬機並不是永運要求對象的年齡必須達到MaxTenuringThreshold才能晉升老年代,如果在Survivor空間中相同年齡的所有對象的大小總和大於Survivor空間的一半,年齡大於或者等於該年齡的對象就可以直接進入老年代。

5 空間分配擔保:
新生代使用的複製算法,新生代分爲Eden區和兩個Survivor, Eden區和一個 Survivor
的大小比例默認是8:1. 新生代進行垃圾回收也就是Minor GC的時候,有可能Survivor空間的大小無法存放所有存活的對象,那麼就需要將新的空間來存放多餘的對象,這部分空間由老年代來貢獻,此時也要保證老年代的剩餘連續的空間是足夠用的。也就是由老年代來擔保此次Minor GC是安全的。條件就是老年代的最大可用的連續空間是否大於新生代所有的空間,如果這個這件成立,那麼擔保就是成立,Minor GC 就是安全的。

如果不成立,虛擬機會查看 HandlePromotionFailure設置值是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象的平均大小,如果大於,將嘗試進行一次Minor GC。如果小於,那麼虛擬機就會改爲進行一次Full GC,當不允許擔保失敗時也會進行一次Full GC。

老年代最大可用連續空間大於歷次晉升到老年代對象的平均大小時,進行Minor GC,也可能失敗,因爲本次的晉升到老年代的對象的數量是不確定的,很有可能大於之前的平均值。如果Minor GC失敗,那麼虛擬機只好重新進行Full GC。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章