目录
1.Minor GC
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。每次 Minor GC 会清理年轻代的内存。
当新生代无法为新生对象分配内存空间的时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,所以发生Minor GC的频率很高,虽然它会触发stop-the-world,但是它的回收速度很快。
2.Major GC
Major GC 是清理老年代。出现Major GC通常会出现至少一次Minor GC
3.Full GC
Full GC是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。
Full GC不等于Major GC,也不等于Minor GC+Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。
4.几种GC算法组合
- 4.1 Serial GC算法:Serial Young GC + Serial Old GC (敲黑板!敲黑板!敲黑板!实际上它是全局范围的Full GC);
- 4.2 Parallel GC算法:Parallel Young GC + 非并行的PS MarkSweep GC / 并行的Parallel Old GC(敲黑板!敲黑板!敲黑板!这俩实际上也是全局范围的Full GC),选PS MarkSweep GC 还是 Parallel Old GC 由参数UseParallelOldGC来控制;
- 4.3 CMS算法:ParNew(Young)GC + CMS(Old)GC (piggyback on ParNew的结果/老生代存活下来的object只做记录,不做compaction)+ Full GC for CMS算法(应对核心的CMS GC某些时候的不赶趟,开销很大);
- 4.4 G1 GC:Young GC + mixed GC(新生代,再加上部分老生代)+ Full GC for G1 GC算法(应对G1 GC算法某些时候的不赶趟,开销很大);
5.几种算法的触发条件
- 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使用比率超过某值;
- 5.5 Full GC for CMS算法和Full GC for G1 GC算法的触发原因很明显,就是5.3 和 5.4 的算法也不能节省太多空间了,只能全局范围大搞一次GC了(相信我,这很慢!这很慢!这很慢!);
参考:
作者:Ted Mosby
链接:https://www.zhihu.com/question/41922036/answer/144566789
来源:知乎