参考答案
Serial
- JDK 1.3 开始提供。
- 新生代收集器。
- 无线程交互开销,单线程收集效率最高。
- 进行垃圾收集时需要暂停用户线程。
- 适用于客户端,小内存堆的回收。
ParNew
- 是 Serial 收集器的多线程并行版。
- JDK 7 之前首选的新生代收集器。
- 第一款支持并发的收集器,首次实现垃圾收集线程与用户线程基本上同时工作。
- 除 Serial 外,只有它能与 CMS 配合。
Parallel Scavenge
- 新生代收集器。
- 标记-复制算法。
- 多线程并行收集器。
- 追求高吞吐量,即最小的垃圾收集时间。
- 可以配置最大停顿时间、垃圾收集时间占比。
- 支持开启垃圾收集自适应调节策略,追求适合的停顿时间或最大的吞吐量。
Serial Old
- 与 Serial 类似,是 Serial 收集器的老年代版本。
- 使用标记-整理算法。
Parallel Old
- JDK 6 开始提供。
- Parallel Scavenge 的老年代版。
- 支持多线程并发收集。
- 标记-整理算法。
- Parallel Scavenge + Parallel Old 是一个追求高吞吐量的组合。
CMS
- 标记-清除算法。
- 追求最短回收停顿时间。
- 多应用于关注响应时间的 B/S 架构的服务端。
- 并发收集、低停顿。
- 占用一部分线程资源,应用程序变慢,吞吐量下降。
- 无法处理浮动垃圾,可能导致 Full GC。
- 内存碎片化问题。
G1
- JDK 6 开始实验,JDK 7 商用。
- 面向服务端,JDK 9 取代 Parallel Scavenge + Parallel Old。
- 结合标记-整理、标记-复制算法。
- 首创局部内存回收设计思路。
- 基于 Region 内存布局,采用不同策略实现分代。
- 不再使用固定大小、固定数量的堆内存分代区域划分。
- 优先回收价收益最大的 Region。
- 单个或多个 Humongous 区域存放大对象。
- 使用记忆集解决跨 Region 引用问题。
- 复杂的卡表实现,导致更高的内存占用,堆的 10%~20%。
- 全功能垃圾收集器。
- 追求有限的时间内最高收集效率、延迟可控的情况下最高吞吐量。
- 追求应付内存分配速率,而非一次性清掉所有垃圾内存。
- 适用于大内存堆。
Shenandoah
- 追求低延迟,停顿 10 毫秒以内。
- OpenJDK 12 新特性,RedHat 提供。
- 连接矩阵代替记忆集,降低内存使用与伪共享问题出现概率。
ZGC
- JDK 11 新加的实验性质的收集器。
- 追求低延迟,停顿 10 毫秒以内。
- 基于 Region 内存布局。
- 未设分代。
- 读屏障、染色指针、内存多重映射实现可并发的标记-整理算法。
- 染色指针和内存多重映射设计精巧,解决部分性能问题,但降低了可用最大内存、操作系统受限、只支持 32 位、不支持压缩指针等。
- 成绩亮眼、性能彪悍。
以上,是JVM面试题【对垃圾收集器了解多少】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—