《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》3.6节
较普遍的内存分配规则:
1. 优先在新生代Eden区分配。Eden区无足够空间时,发起一次Minor GC(新生代GC)
2. 大对象直接进入老年代。避免Eden、Survivor间发生大量复制
3. 长期存活的对象将进入老年代。对象在Survivor“熬过”一次Minor GC年龄加1,当年龄达到阈值(默认15)被晋升到老年代
4. 动态对象年龄判定。若Survivor中相同年龄对象大小总和大于Survivor空间一半,年龄大于或等于该年龄的对象可直接进入老年代,无须等到MaxTenuringThreshold要求的年龄
5. 空间分配担保。Minor GC前,检查老年代最大可用连续空间是否大于新生代所有对象总空间,若是,则Minor GC可确保是安全的,若不是,则查看是否允许担保失败,若允许,则继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,若大于,则进行Minor GC(有风险,若风险发生则进行Full GC),若小于、或不允许担保失败,则进行Full GC(老年代GC)
参数:
-XX:+PrintGCDetails,打印内存收集日志
-XX:PretenureSizeThreshold,直接分配到老年代的对象大小阈值
-XX:MaxTenuringThreshold,对象晋升老年代的年龄阈值
-XX:+HandlePromotionFailure,允许担保失败/允许Minor GC冒险,JDK 6 Update 24后此参数失效,固定设置为允许担保失败