JVM內存分配策略

JVM內存分配策略

對象優先在新生代的Eden上分配

大對象直接進入老年代

大對象就是需要大量連續內存的Java對象,如長字符串與數組,大對象可能導致內存還有不少剩餘空間時就觸發GC以獲取足夠的連續空間來安置這個大對象,所以寫程序儘量避免大對象,特別是短命大對象1)為了避免在Eden和兩個Survivor之間發生大量的內存拷貝,大對象直接在老年代分配(有個值可以設置-XX:PretenureSizeThreshold,大於這個值就當作大對象直接到老年代去)

長期存活(15歲)的對象將進入老年代

新生代的對象每熬過一次minor gc(當Eden區滿時,觸發Minor GC,老年代或者方法區空間不足時,觸發Full GC),年齡就增加1歲,當增加到一定程度(默認15歲)時,就會被晉升到老年代

動態對象年齡判定

也並不是年齡達到15歲才能進入老年代的,如果在Survivor空間中相同年齡所有對象大小總和大於Survivor空間的一半,年齡大於或等於該年齡的對象就可以直接進入老年代

空間分配擔保

在發生minor gc時,因為檢測完會有一部分對象進入老年代,所以虛擬機會先檢測老年代的內存夠不夠(之前每次晉升到老年代的平均大小>老年代的剩餘空間?),如果不夠了,那麼改為進行一次full gc,如果內存還夠,那麼檢查是否允許擔保失敗,如果不允許,那麼還是進行一次full gc(一般設置為允許擔保失敗以避免full gc過於頻繁)


分享到:


相關文章: