簡明內存分配策略

對象優先在Eden分配。當Eden區沒有足夠空間分配時,虛擬機將發起一次Minor GC

Minor GC 和 Full GC是啥意思

新生代GC(Minor): 指發生在新生代的垃圾收集動作,因爲Java對象大多都具有朝生夕死的特性,所以Minor GC非常頻繁,一般回收速度比較快。

老年代GC(Major GC/Full GC):指發生在老年代的GC,出現Major GC,通常會伴隨至少一次的Minor GC。Major GC的速度一般會比Minor GC慢10倍以上。

大對象直接進入老年代

所謂大對象指,需要大量連續內存空間的JAVA對象,最典型的大對象就是那種很長的字符串及數組。大對象以內存分配來說是一個壞消息。經常出現大對象容易導致內存還有不少空間時,提前觸發垃圾回收,以此得到足夠的連續空間。
參數 -XX:PretenureSizeThreahold 指大於些設置的對象直接進入老年代。

長期存活的對象進入老年代

說對象內存佈局時,提到了對象頭裏有對象的分代年齡。對象出生在Enden區,經過第一次Minor GC後,仍存活且Survivor能容納,對象年齡就設置爲1。之後,每經歷一次Minor GC,對象年齡就增加1。當年齡增加到一定程度(默認15歲),該對象就進入老年代。參數 -XX:MaxTenuring Threshold設定此閾值。

對象提前進入老年代的情景:如果Survivor空間中相同年齡的所有對象大小之和,比Survivor的一半還大,那該年齡,以及大於該年齡的對象直接進入老年代。

空間分配擔保

在發生Minor GC之前,虛擬機會檢查老年代最大可用連續空間是否大於新生代所有對象總和,如果條件成立,那Minor GC可以確保是安全的。如果不成立,則查看HandlePromotionFailure設置值是否允許擔保失敗。如果允許,那會繼續檢查老年代最大可用的連續空間是否大於歷次晉升到老年代對象平均大小 ,如果大於,則嘗試進行一次Minor GC。如果是小於,或HandlePromotionFailure設置爲不允許,則時行一次Full GC。

上面說的取平均值進行比較其實仍然是一種動態概率的手段,是有可能出現擔保失敗。如果出現了擔保失敗,那隻好在失敗之後重新發起一次Full GC。爲避免Full GC過於頻繁,多數情況下,將HandlePromotionFailure開關打開。

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