📌 PDF :大白话说Java面试题 --- 02-JVM篇
第16题:JVM有哪些垃圾收集器
📚 回答:
- 核心分类 :
JVM 提供了多种垃圾收集器,分别针对年轻代和老年代的不同需求进行优化。以下是常见的垃圾收集器及其特点:
1. Serial 和 Serial Old 收集器
-
特点:
- 单线程垃圾收集器,使用单条 GC 线程完成垃圾回收工作。
- 回收过程中会触发 STW(Stop-The-World),暂停所有用户线程。
-
算法:
- Serial:标记-复制算法,适用于年轻代。
- Serial Old:标记-整理算法,适用于老年代。
-
适用场景:
- 单线程环境或小型应用,对停顿时间不敏感的场景。
2. Parallel 和 Parallel Old 收集器
-
特点:
- 多线程垃圾收集器,使用多条 GC 线程并行完成垃圾回收工作。
- 同样会触发 STW,但通过多线程提升回收效率。
-
算法:
- Parallel:标记-复制算法,适用于年轻代。
- Parallel Old:标记-整理算法,适用于老年代。
-
适用场景:
- 多核 CPU 环境下,追求高吞吐量的应用(如后台批处理任务)。
3. ParNew 收集器
-
特点:
- 类似于 Parallel 收集器,但支持与 CMS 收集器配合使用。
-
算法:
- 标记-复制算法,适用于年轻代。
-
适用场景:
- 配合 CMS 使用的老年代垃圾收集器,适合低延迟场景。
4. CMS(Concurrent Mark-Sweep)收集器
-
特点:
- 并发垃圾收集器,追求最短停顿时间(STW),适合注重用户体验的应用。
-
回收过程:
- 初始标记:暂停所有用户线程,标记 GC Roots 直接关联的对象。
- 并发标记:允许用户线程继续运行,GC 线程从 GC Roots 开始遍历整个对象图。
- 重新标记:暂停所有用户线程,修正并发标记期间发生状态改变的对象。
- 并发清理:用户线程继续运行,GC 线程回收未标记的对象。
- 并发重置:重置标记状态,为下一次回收做准备。
-
算法:
- 标记-清除算法,可能导致内存碎片问题。
-
适用场景:
- 对响应时间敏感的应用(如 Web 应用、在线服务)。
5. G1(Garbage First)收集器
-
特点:
- 划分堆区为多个区域(Region),优先回收垃圾最多的区域(Garbage First)。
- 平衡吞吐量和延迟,适合大内存应用。
-
算法:
- 标记-整理算法,避免内存碎片问题。
-
适用场景:
- 大内存环境下,兼顾吞吐量和低延迟的需求。
6. ZGC 和 Shenandoah 收集器
-
特点:
- 新一代低延迟垃圾收集器,几乎可以做到毫秒级的 STW。
-
算法:
- 基于并发标记和整理,避免内存碎片问题。
-
适用场景:
- 超大内存和高并发场景下的低延迟需求。
7. 总结对比
| 收集器 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Serial | 单线程环境或小型应用 | 简单高效 | 停顿时间长,不适合多核环境 |
| Parallel | 多核 CPU 下的高吞吐量应用 | 多线程并行,回收效率高 | 停顿时间较长 |
| CMS | 对响应时间敏感的应用 | 最短停顿时间,用户体验好 | 内存碎片化问题,CPU 开销较大 |
| G1 | 大内存环境下的平衡需求 | 平衡吞吐量和延迟,避免内存碎片 | 复杂度较高 |
| ZGC/Shenandoah | 超大内存和高并发场景 | 毫秒级停顿时间,低延迟 | 资源消耗较大,调试复杂 |
💡 面试官视角:
- 面试官可能会问"如何选择垃圾收集器?"答:根据应用场景选择,吞吐量优先选 ParallelGC,低延迟优先选 G1 或 ZGC。
- 面试官可能会追问"CMS 和 G1 的区别是什么?"答:CMS 更适合追求低延迟的场景,但存在内存碎片问题;G1 通过分区域回收和预测停顿时间,进一步降低了 STW 的影响。
觉得对您有帮助,麻烦 点点关注啦 ,您的关注是我创作的最大动力~ 🎯