在HotSpot VM的实现,它里面的GC其实准确分类有两种:
1,Parital GC(局部GC):并不收集整个GC堆的模式
- Young GC:只收集young gen的GC, Young GC也称作"Minor GC"
- Old GC :只收集old gen 的GC,只有垃圾收集器CMS的concurrent collection是这个模式
- Mixed GC:收集整个整个young gen以及部分old gen的GC。只有垃圾收集器G1有这个模式
2,Full GC:收集整个堆,包括新生代、老年代、永久代(在JDK1.8后,永久代换为metaspace)等所有部分的模式。
3, CMS算法:ParNew(Young)GC + CMS(Old)GC (piggyback on ParNew的结果/老生代存活下来的object只做记录,不做compaction)+ Full GC for CMS算法(应对核心的CMS GC某些时候的不赶趟,开销很大);
4, G1 GC:Young GC + mixed GC(新生代,再加上部分老生代)+ Full GC for G1 GC算法(应对G1 GC算法某些时候的不赶趟,开销很大);
5.1 各种Young GC的触发原因都是eden区满了;
5.2 Serial Old GC/PS MarkSweep GC/Parallel Old GC的触发则是在要执行Young GC时候预测其promote的object的总size超过老生代剩余size;
5.3 CMS GC的initial marking的触发条件是老生代使用比率超过某值;
5.4 G1 GC的initial marking的触发条件是Heap使用比率超过某值,跟4.3 heuristics 类似;
5.5 Full GC for CMS算法和Full GC for G1 GC算法的触发原因很明显,就是4.3 和 4.4 的fancy算法不赶趟了,只能全局范围大搞一次GC了(相信我,这很慢!这很慢!这很慢!);
6 题主说的 “Full GC会先触发一次Minor GC” - 指的应该是
https://www.zhihu.com/question/41922036/answer/93079526