对象优先在新生代的 Eden 上分配
大对象直接进入老年代
大对象就是需要大量连续内存的 Java 对象,如长字符串与数组,大对象可能导致内存还有不少剩余空间时就触发 GC 以获取足够的连续空间来安置这个大对象,所以写程序尽量避免大对象,特别是短命大对象
1)为了避免在 Eden 和两个 Survivor 之间发生大量的内存拷贝,大对象直接在老年代分配(有个值可以设置-XX:PretenureSizeThreshold,大于这个值就当作大对象直接到老年代去)
长期存活的对象将进入老年代
新生代的对象每熬过一次 minor gc,年龄就增加 1 岁,当增加到一定程度(默认 15 岁)时,就会被晋升到老年代
动态对象年龄判定
也并不是年龄达到 15 岁才能进入老年代的,如果在 Survivor 空间中相同年龄所有对象大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代
空间分配担保
在发生 minor gc 时,因为检测完会有一部分对象进入老年代,所以虚拟机会先检测老年代的内存够不够(之前每次晋升到老年代的平均大小 > 老年代的剩余空间?),如果不够了,那么改为进行一次 full gc,如果内存还够,那么检查是否允许担保失败,如果不允许,那么还是进行一次 full gc(一般设置为允许担保失败以避免 full gc 过于频繁)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于