正常我们创建一个对象,都会直接进入新生代的Eden区,那一个对象有哪几种方法可以进入老年代呢?
对象进入老年代,有三种情况:
1.占用内存较大的对象,直接进入老年代,这个“大”由参数-XX:PretenureSizeThreshold来决定,超过这个参数设置的值就直接进入老年代,例如很长的字符串、很大的数组。
2.正常创建一个对象,对象内存布局,包含三部分信息(对象头、实例数据、对齐数据),对象头中存储的就是两部分信息,一部分是对象的运行时数据(GC年龄、锁信息等),一部分是类型指针,GC年龄在对象初始化时,为1,每经过一次minorGC年龄增1,达到系统设置XX:MaxTenuringThreshold年龄值之后,进入老年代
3.当一个对象从Eden区到了Survivor区,当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要达到默认的分代年龄
网友评论