1. 程式人生 > 其它 >5.6堆空間分代思想&5.7記憶體分配策略

5.6堆空間分代思想&5.7記憶體分配策略

目錄

5.6堆空間分代思想

為什麼需要把Java堆分代?不分代就不能正常工作嗎?

不同物件的生命週期不同。70% - 99%的物件是臨時物件。

新生代:有Eden、兩塊大小相同的Survivor(又稱from/to,s0/s1)構成,to總為空。

老年代:存放新生代中經歷多次GC仍然存活的物件。

5.7記憶體分配策略

如果物件在Eden出生並經過第一次MinorGC後仍然存活,並且能被Survivor容納的話,將被移動到Survivor空間中,並將物件年齡設為1。物件在Survivor區中每熬過一次MinorGC,年齡就增加1歲,當它的年齡增加到一定程度(預設15歲,其實每個JVM、每個GC都有所不同)時,就會被晉升到老年代中。

物件晉升老年代的年齡閾值,可以通過選項 -XX:MaxTenuringThreshold 來設定。

針對不同年齡段的物件分配原則如下所示:

1.優先分配到Eden

2.大物件直接分配到老年代

儘量避免程式中出現過多的大物件

3.長期存活的物件分配到老年代

4.動態物件年齡判斷

如果Survivor區中相同年齡的所有物件大小的總和大於Survivor空間的一半,年齡大於或等於該年齡的物件可以直接進入老年代,無須等到MaxTenuringThreshold中要求的年齡。

5.空間分配擔保

-XX:HandlePromtionFailure