一、垃圾收集器总览
新生代:Serial、 ParNew、 Parallel Scavenge
老年代:CMS、Serial Old、 Parallel Old
最新的:G1
并行和并发的区别:
并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
并发:指用户线程和垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户线程在继续执行,而垃圾收集程序运行于另一个CPU上。
二、收集器
1. Serial收集器
单线程收集器、“Stop The World”(必须停止其他工作线程)
主要运行在Client模式下,简单而且高效。
2. ParNew收集器
Serial的多线程版本,Server模式下的虚拟机首选的新生代收集器,除了Serial唯一可以与CMS收集器配合工作的收集器。
3.Parallel Scavenge收集器
吞吐量优先的收集器、Parallel Scavenge收集器目标是达到一个可控制的吞吐量。(吞吐量=运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间))。拥有GC自适应的调节策略。
4. Serial Old收集器
Serial收集器的老年代版本,单线程,使用“标记 - 整理”算法。
5. Parallel Old收集器
Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。吞吐量优先的收集器的组合(Parallel Scavenge 和 Parallel Old)。
6. CMS收集器
以获取最短回收停顿时间为目标。基于“标记 — 清除”算法。
具体实现主要为四个步骤:
- 初始标记 (Stop the world) 初始标记仅仅是标记GC Roots能直接关联到的对象;
- 并发标记 并发标记进行GC Roots Tracing;
- 重新标记 (Stop the world) 重新标记修正并发标记期间,标记产生变动的记录;
- 并发清除
CMS收集器的缺点:
- 对CPU资源过于敏感
- 无法处理“浮动垃圾”(并发清除阶段产生的垃圾)。因此需要在老年代空间中为浮动垃圾预留一部分空间,如果预留空间不足,则会出现一次“Concurrent Mode Failure”失败,临时启用Serial Old收集器进行垃圾回收。
- 基于标记清除算法,会产生内存碎片。
7. G1收集器
G1收集器的特点:
- 并行与并发
- 分代收集
- 空间整合
- 可预测的停顿