serial | parNew | Parallel Scavenge | GI | CMS | Serial Old | Parallel Old | |
---|---|---|---|---|---|---|---|
回收代 | 新 | 新 | 新 | 新,老 | 老 | 老 | 老 |
算法 | 复制 | 复制 | 复制 | 分代 | 标记-清除 | 标记–整理 | 标记–整理 |
线程 | 单 | 多 | 多 | 多 | 多 | 单 | 多 |
特点 | stw,简单高效 | Serial的多线程版本 | 自适应调节策略,吞吐量大 | 堆划分为大小相同的region | 低停顿 | 同前 | 同前 |
jdk8环境下,默认使用 Parallel Scavenge + Parallel Old
垃圾收集器
Serial(串行收集器)
- 特性:单线程,stop the world,采用复制算法
- 应用场景:jvm在Client模式下默认的新生代收集器
- 优点:简单高效
ParNew
- 特点:是Serial的多线程版本,采用复制算法
- 应用场景:在Server模式下常用的新生代收集器,可与CMS配合工作
Parallel Scavenge
- 特点:并行的多线程收集器,采用复制算法,吞吐量优先,有自适应调节策略
- 应用场景:需要吞吐量大的时候
SerialOld
- 特点:Serial的老年代版本,单线程,使用标记-整理算法
Parallel Old
- Parallel Scavenge的老年代版本,多线程,标记-整理算法
CMS
- 特点:以最短回收停顿时间为目标,使用标记-清除算法
- 过程:
- 初始标记:stop the world 标记GC Roots能直接关联到的对象
- 并发标记:进行GC Roots Tracing
- 重新标记:stop the world;修正并发标记期间因用户程序继续运作而导致标记产生变动的 那一部分对象的标记记录
- 并发清除:清除对象
- 优点:并发收集,低停顿
- 缺点:
- 对CPU资源敏感
- 无法处理浮动垃圾(并发清除 时,用户线程仍在运行,此时产生的垃圾为浮动垃圾)
- 产生大量的空间碎片
G1
- 特点:
- 面向服务端应用,将整个堆划分为大小相同的region。
- 并行与并发
- 分代收集
- 空间整合:从整体看是基于“标记-整理”的,从局部(两个region之间)看是基于“复制”的。
- 可预测的停顿:使用者可明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
- 执行过程:
- 初始标记:stop the world 标记GC Roots能直接关联到的对象
- 并发标记:可达性分析
- 最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录
- 筛选回收:筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划