对象优先在Eden区分配
大多数时候,对象在新生代Eden区分配,当Eden区中没有足够的空间进行分配时,虚拟机将发起一次Minor GC。 Minor GC(新生代GC):速度非常快,非常频繁 Majar GC/Full GC(老年代GC):速度比Minor GC慢10倍以上
大对象直接进入老年代
JVM提供了-XX:PretenureSizeThreshold参数,设置大于该值的对象直接分配进入老年代,这样的目的是为了减少 在Eden区和Survivor区之间发生大量的内存复制。在编码时要尽量避免“朝生夕灭”的短命大对象,经常出现大对象 容易导致内存还有不少空间就提前触发了GC以获取更多的连续的内存空间
长期存活的对象进入老年代
JVM给每个对象定义了一个年龄计数器,通过-XX:MaxTenuringThreshold=?来控制年龄阈值。 如果对象在Eden区出生并经过第一次Minor GC后仍然存活,并被Survivor容纳的话,将被移到Survivor空间, 且年龄加1.每次Minor GC都会加1,直到年龄到了预设的老年代阈值,对象就会被晋升到老年代。
动态对象年龄判定
如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象直接 进入到老年代,无需到达设定的阈值。
空间分配担保
在jdk6之后,只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小,就会进行minor gc,否则进行full gc