天天看點

java虛拟機的記憶體配置設定政策

1,對象優先配置設定在Eden區

大多數情況下,對象在新生代Eden區中配置設定。當Eden區沒有足夠空間進行配置設定時,虛拟機執行一次Minor GC。

GC後剩下的對象如果無法放入Survivor區,通過配置設定擔保進入老年代。

2,大對象直接進入老年代

大對象是指需要大量連續記憶體空間的對象。

可以通過設定-XX:PretenureSizeThreshold來決定超過多大的對象會直接進入老年代。

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

虛拟機為每一個對象都定義了一個對象年齡計數器。如果對象在Eden區出生并經過第一次Minor GC後仍然存活,并且能被Survivor區容納的話,将被移動到Survivor區,同時對象年齡設為1.之後對象每經過一次Minor GC ,對象年齡加1。當對象年齡增加到一定值,便會晉升到老年代。

可以通過-XX:MaxTenuringThreshold參數設定進入老年代的年齡。

4,動态對象年齡判定

如果在Survivor區中相同年齡是以對象大小的總和大于Survivor的一半,年齡大于或等于該年齡的對象直接進入老年代,不需要等到XX:MaxTenuringThreshold要求的年齡。

5,空間配置設定擔保

第一點說了配置設定擔保的情況,但是前提是老年代本身得有容納那些對象的空間,一共有多少對象存活下來再實際完成記憶體回收之前是無法明确知道的,是以隻好取之前每一次回收晉升到老年代對象容量的平均值作為經驗值,來決定是否進行Full GC來讓老年代騰出更多空間。

取平均值的方法不是一個100%可用的方法,如果對象突增,遠遠高于平均值,就會導緻擔保失敗。但是擔保失敗後還是會重新發起一次Full GC。

繼續閱讀