现在eden区分配,如果Eden区没有可放的空间则执行新生代回收,一般新生代都是使用的是复制算法,则把存活的放在了survivor区,如果survivor区无法放下存活的对象,则执行分配担保放在了老年代上。如果分配担保失败,也就是说老年代无法放下了就会执行老年代的垃圾回收。(注意:这里说的适用于Servial收集器,不代表适用其他的收集器,其他的收集器可能在什么时候和怎么回收都会一些区别)
这其中有几点需要注意的地方:
- 可以通过-XX:PretenureSizeThreshold参数来配置多大的对象就直接被分配到了老年代,不用再在新生代上来回折腾了
- 可以通过-XX:MaxTenuringThreshold参数来配置在年轻代经过多少次回收后进入年老代。这个配置默认是15次
- 虚拟机也不是说是要必须要达到XX:MaxTenuringThreshold配置的年龄才能被收入到老年代。如果说在survivor区相同年龄的对象大于该区域的一半大小的时候就被回收到老年代
- 通过HandlePromotionFailure参数来设置是否允许担保失败,就是在年轻代进行垃圾回收的时候会判断目前存在年轻代中的对象是否都可以放在老年代上,如果可以的话就说明分配担保是安全的,如果老年代上没有这么多的空间放下年轻代所有的对象就会通过这个参数来判断是否打开,如果打开的话就会判断老年代上连续的空间是否大于每次晋升老年代对象的平均值,如果大于则说明可以尝试进行年轻代回收,如果小于则说明不允许冒险。