1.优先分配到eden区
我们在方法里面显示的创建一个对象,它是会被优先分配到eden区。
2.大对象直接进入到年老代
-XX:PretenureSizeThreshold 这个参数可以设置超过多大内存空间的对象直接直接进入老年代,默认值为0。就是不论对象多大,都直接在eden区分配。
3.长期存活的对象进入到老年代
虚拟机给每个对象定义了一个年龄计数器,每次在survivor区迁移一次,年龄加一。默认是年龄大于15的就会晋升到老年代。
这个值我们可以通过-XX:MaxTenuringThreshold来进行设置多大的年龄可以晋升到年老代。
4.动态年龄判定
虚拟机并不会完全按照每个对象的年龄来确定是否可以晋升到年老代。如果survivor区内的相同年龄的对象的大小总数已经大于当前survivor区大小的一般的时候,那么年龄大于或者等于当前年龄大小的对象就会直接进入到年老代。
5.内存担保
当新生代垃圾回收的时候,一个survivor区没有足够的空间去接纳全部生存的新生代的对象的时候怎么办呢?由此可见,新生代的复制算法在理论上来说是有一定的风险的。这个时候就要一种担保机制。现在我们普遍用的JDK1.7 1.8使用的担保规则就是每次新生代GC之前会进行一次检查。如果年老代的连续空间的大小如果大于历次晋升年老代的对象的平均大小,那么就是进行一次年轻代GC,否则进行一次FullGC(年老代和年轻代一块清理).
6.内存分配规则简单流程图