鉴于现在各种GC名称已经叫混了,首先声明一下Minor GC和Full GC的定义:
Minor GC: 回收区域只包括年轻代(Eden, From)。
Full GC: 回收区域包括整个堆区和方法区。
注:有的人把Major GC和Full GC混为一谈,我更愿意认为Major GC等价于Old GC,目前只有CMS收集器存在只回收老年代的情况。
Minor GC触发条件:
- Eden空间不足。
注:Parallel Scavenge垃圾收集器框架(Parallel Scavenge+PS MarkSweep或者Parallel Scavenge + Parallel Old)有个小的实现细节,每次Full GC之前都会先进行一次Minor GC。
full gc触发条件:
- 大对象直接进入老年代时老年代连续空间不足
- 年轻代对象经过Minor GC晋升老年代时老年代连续空间不足
在发生minor gc之前虚拟机将会检查老年代剩余空间是否大于新生代对象总空间(考虑最坏情况,新生代所有对象都晋升),如果条件成立,那么可以确保这次minor gc是安全的。否则,虚拟机会虚拟机参数HandlePromotionFailure的设置值是够允许冒险(允许:-XX:+HandlePromotionFailure,不允许:-XX:-HandlePromotionFailure)。如果允许那么虚拟机会查看老年代剩余空间是否大于历次晋升老年代对象大小的平均值,