1. 概览

具体对象的内存分配规则取决于垃圾收集器的组合,还有JVM内存相关的参数设定。本节讨论几种常见的内存分配与回收策略。

2. 对象优先在Eden分配

Eden区没有足够空间进行分配,将会进行一次Minor GC。Minor GC在新生代回收,发生在老年代的full GC一般比minor GC慢10倍

3. 大对象优先在老年代分配

要尽量避免朝生夕死的大对象。设置参数
-XX: PretenureSizeThreshold可以使得超过这个大小的直接在老年代分配,而且这个参数只对Serial和ParNew收集器有效。可以在ParNew+CMS场景试用。该参数单位是字节。

4. 长期存活的对象进入老年代

对象每熬过一次Minor GC就增加1岁,默认增加到15岁,晋升到老年代。晋升年龄可以通过参数-XX:MaxTenuringThreshold来设置,单位:岁

5. 动态对象年龄判定

并不是必须达到设定年龄才能进入老年代,如果满足同年龄对象达到Survivor空间的一半,可以直接进入老年代

6.空间分配担保

Survivor无法容纳的对象需要进入老年代,这时候JVM取之前每一次回收晋升到老年代对象容量的平均大小作为经验值,与老年代的升序空间进行比较,如果老年代没足够空间担保,就担保失败,会进行一次Full GC。