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

posted @   Lz_蚂蚱  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起