垃圾收集器主要包括 Serial、ParNew、Parallel Scavenge、CMS、G1
Serial:单线程;简单而高效(与其他收集器的单线程相比);新生代采用复制算法,老年代采用标记-整理算法。进行垃圾收集工作的时候必须暂停其他所有的工作线程( “Stop The World” )。
ParNew:ParNew 收集器其实就是 Serial 收集器的多线程版本。
Parallel Scavenge:几乎和 ParNew 一样,关注点是吞吐量(高效率的利用 CPU,吞吐量是 CPU 中用于运行用户代码的时间与 CPU 总消耗时间的比值)。可设置 Parallel 收集器+ 老年代串行/老年代并行。
CMS:是一种以获取最短回收停顿时间为目标的并发收集器,实现了让垃圾收集线程与用户线程(基本上)同时工作。基于“标记-清除”算法。
CMS 运作分为 4 个步骤:
1.初始标记:暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快。
2.并发标记:同时开启 GC 和用户线程,记录可达对象,但并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
3.重新标记:重新标记阶段修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,导致短暂停顿。
4.并发清除:开启用户线程,同时 GC 线程开始对为标记的区域做清扫。
CMS 主要优缺点:并发收集、低停顿;对 CPU 资源敏感、无法处理浮动垃圾、使用“标记-清除”算法会导致收集结束时会有大量空间碎片产生。
G1:G1 (Garbage-First) 主要针对配备多处理器及大容量内存的机器. 具备低停顿和高吞吐量特征。G1 从整体来看是基于“标记整理”算法实现的收集器,从局部上来看是基于“复制”算法实现的。
G1 在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来)。
G1 主要有并行与并发、分代收集、空间整合、可预测的停顿的特点。运作大致分为初始标记、并发标记、最终标记、筛选回收这四个过程。