Minor GC:
年轻带GC,频繁。当eden区不够用时,会触发。GC中如果to空间不足,则利用担保机制进入老年代。
Major GC:
老年代GC。
Full GC:
清理整个堆,包括年轻代和老年代。
触发条件:
(1)调用Sytem.GC(),不是立马执行。
(2)老年代空间不足时
(3)GC担保失败:
在发生Minor GC之前,JVM会检查老年代最大可用的连续空间是否大于新生代所有对象总空间。如果条件成立,那么Minor GC是安全的。反之,如果不成立,那么要仍然要看HandlePromotionFailure值,是否允许担保失败。如果允许担保失败,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。如果大于,则冒险尝试一次Minor GC,如果小于或者不允许担保失败,则要进行一次Full GC。
补充:冒险尝试Minor GC,是因为新生代采用复制收集算法,每次使用一个Survivor空间进行轮换备份,因此,如果当大量对象在一次Minor GC之后,仍然存活,老年代就要进行分配担保。也就是老年代要保证本身有可以容纳这些对象的剩余空间。