[jvm] -- 垃圾收集器篇
-
垃圾收集器
-
Serial 收集器
- 单线程收集器,不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。
-
ParNew 收集器
- Serial 多线程版本。
- 新生代采用复制算法,老年代采用标记-整理算法。
-
Parallel Scavenge 收集器
- 使用复制算法的多线程收集器。
- 关注点是吞吐量。
- 新生代采用复制算法,老年代采用标记-整理算法。
-
Serial Old 收集器
- Serial收集器的老年代版本,它同样是一个单线程收集器。
- 用途
- 在 JDK1.5 以及以前的版本中与 Parallel Scavenge 收集器搭配使用。
- 作为 CMS 收集器的后备方案。
-
Parallel Old 收集器
- Parallel Scavenge 收集器的老年代版本。
- 使用多线程和“标记-整理”算法。在注重吞吐量以及 CPU 资源的场合,都可以优先考虑 Parallel Scavenge 收集器和 Parallel Old 收集器。
-
CMS 收集器
- 是一种以获取最短回收停顿时间为目标的收集器。
- 它非常符合在注重用户体验的应用上使用。
- 使用标记-清除算法。
- 四个步骤
- 初始标记:暂停所有的其他线程,并记录下直接与root相连的对象,速度很快;
- 并发年标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
- 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
- 并发清除:开启用户线程,同时 GC 线程开始对为标记的区域做清扫。
- 缺点:
- 对 CPU 资源敏感
- 无法处理浮动垃圾
- 它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生
-
G1 收集器
- 面向服务器的垃圾收集器
- 主要针对配备多颗处理器及大容量内存的机器
- 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
- 特点:
- 并行与并发
- 分代收集
- 空间整合:整体基于标记整理算法,局部基于“复制”算法
- 可预测的停顿
- 步骤:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
明明可以靠才华吃饭,非要靠脸~