MinorGC:
绝大多数被创建的对象会被分配到新生代,由于大部分对象在创建后会很快变得不可达,所以很多对象被创建在新生代,然后消失。对象从新生代消失的过程称之为MinorGC。一般当Eden区的空间不够时,会触发MinorGC。
MajorGC:
老年代存储着一些生命周期长的对象。老年代所占空间比新生代大,发生在老年代上的GC比新生代少得多。对象从老年代消失的过程,称之为MajorGC。当老年代空间不够时,会触发MajorGC。
FullGC:
FullGC是清理整个对空间包括老年代和新生代。许多MajorGC都是MinorGC触发的,所以很多情况下这两种GC分离是不太可能的。当两者都发生时,可以看成发生了FullGC。从实际操作来看,FullGC的触发场景有:
1. System.gc(),建议jvm进行FullGC。
2. 老年代空间不足。
3. 永久代空间不足,现代垃圾收集机制在进行FullGC时会清理部分永久代空间。
4. CMS GC时出现promotion failed和concurrent mode failure,promotion failed是在进行Minor GC时,survivor space放不下,对象只能放入老年代,而此时老年代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足造成的(有时候“空间不足”是CMS GC时当前的浮动垃圾过多导致暂时性的空间不足)。
5. 统计得到Minor GC后晋升到老年代的平均大小大于老年代的剩余空间。此时老年代可能空间不足,也会进行FullGC。
6. 堆中分配很大的对象,此时对象会直接进入老年代,而老年代没有连续的空间分配给大对象,触发FullGC。
个人理解:MajorGC时往往伴随着MinorGC,会同时清理新生代和老年代,这正是FullGC的表现。所以经常将FullGC和MajorGC混为一谈。