1.对象优先在Eden区分配
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC
2.大对象直接进入老年代
虚拟机提供了一个-XX:PretenureSizeThreshhold参数,令大于这个设置值的对象直接在老年代进行分配,这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存复制。
3.长期存活的对象将进入老年代
虚拟机在每个对象头里保存了对象的分代年龄,如果对象在Eden出生,并经过第一次MinorGC后仍然存活,并且能被survivor区容纳的话,将被移动到Survivor区,并且对象的年龄设为1。每熬过一次Minor GC年龄就增加一岁,当年龄增加到一定程度(默认15岁),将会被晋升到老年代中。晋升到老年代的阈值,可以通过参数-XX:MaxTenuringThreshold设置。
4.动态对象年龄判定
为了能更好的适应不同程序的内存状况,虚拟机并不是永远要求对象年龄必须到达MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。
5.空间分配担保
在发生MinorGC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么MinorGC可以确保是安全的,如果不成立,检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次MinorGC,尽管这次MinorGC是有风险的;如果小于,那这时改为进行一次Full GC.
取平均值进行比较是一种动态概率的手段,这里的风险就是如果某次Minor GC后存活的对象突增,远高于历次平均值的话,那就会担保失败,如果出现了担保失败,那就只好重新发起一次Full GC.
本文深入探讨Java垃圾回收机制,包括对象优先在Eden区分配、大对象直接进入老年代、长期存活对象晋升机制、动态对象年龄判定及空间分配担保策略,揭示了垃圾回收的关键细节。
7837

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



