5.6堆空間分代思想&5.7記憶體分配策略
阿新 • • 發佈:2021-10-19
目錄
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