对象何时进入老生代

内存分配策略

对象的内存分配其实就是在堆上分配,那么细分呢,什么时候在新生代什么时候在老生代都是需要了解的问题。这些问题与虚拟机垃圾回收器有关,但是大多数情况下,对象优先在新生代的Eden区上分配空间,但是也有直接在老生代分配内存的情况。

1 对象优先在Eden区分配内存

如果Eden区的空间足够大,那么就将新创建的对象放在Eden区,如果Eden区剩余空间不足以放置新的对象了,则会触发一次Minor GC,GC之后依然存活的对象会进入Surviver区,同样,如果顺利完成转换的话,那么Eden区就会空出来,就可以放置新的对象了,可是如果在第一次Minor GC后,存活的对象太多Surviver区满足不了要求,那么这部分会直接转入老生代。总之就是,想方设法将对象放在Eden区,但是如果Eden或Surviver区空间满足不了的话,就会出现有些对象提前进入老生代的情况。

2 大对象直接进入老生代

所谓大对象就是指,需要很大的连续空间才能存储的对象,比如超长的字符串或者大数组这种,这种对象创建后可能导致内存空间不足,需要提前触发GC,虚拟机提供了参数可以设置多大的对象可以直接进入老生代,超过这个参数的对象就会被直接分配到老生代中。

3 长期存活的对象进入老生代

虚拟机采用分代的思想管理内存而不是分区的思想,说明了这和对象的年龄有关,对象在每次GC之后依然能存活下来,那么年龄就会增加一年。对象从Eden区出生,在Eden区需要进行GC之后,如果该对象依然存活,那么就会被移入Surviver区,年龄也就是从Surviver区开始计算,每经过一次Surviver的GC之后,该对象的年龄就会增加一年,如果对象的年龄增加到了默认的年龄15岁,那么这个对象就被移入老生代,当然,虚拟机的默认值也是可以设置的。

4 未达到年龄的Surviver对象也可能进入老生代

虚拟机采用年龄的方式来进入老生代只是多种方式的一种,还有一种情况是,如果在Surviver区中,相同年龄的对象所占的总空间大于Surviver区的一半了,那么Surviver区中所有大于这个年龄的对象都会被移入老生代,这也可以看做是Surviver区的一种GC情况。

猜你喜欢

转载自blog.csdn.net/xdzhouxin/article/details/81218578