1 对象优先在Eden区分配
当Eden区没有足够的空间进行分配时,虚拟机将会发起一次Minor GC
2 大对象直接进入老年代
虚拟机提供一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配,避免在Eden区及两个Survivor区之间发生大量的内存复制
3 长期存活对象将进入老年代
虚拟机对每一个对象定义了一个年龄计数器,对象每熬过一次Minor GC,相对应的年龄就会增加一岁,当年龄增加到一定岁数时,就将会晋升到老年代中,默认为十五岁。年龄阈值可以通过参数-XX:MaxTenuringThreshold设置
4 动态对象年龄判断
如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,那么年龄大于或等于该年龄的对象就可以直接进入老年代
5 空间担保分配
在发生Minor GC 之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的总和,如果这个条件成立,那么Minor GC 就是安全的,否则,虚拟机机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于就会再尝试一次Minor GC ,尽管它是有风险的。如果小于,或者上述设置值不允许失败,那这时也要改为进行一次Full GC
本文介绍了Java虚拟机中对象分配的基本原则,包括对象在Eden区的初始分配、大对象直接进入老年代、长期存活对象晋升至老年代的过程,以及动态对象年龄判断和空间担保分配策略。
1245

被折叠的 条评论
为什么被折叠?



