【大白话说Java面试题 第56题】【JVM篇】第16题:JVM有哪些垃圾收集器?

📌 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),适合注重用户体验的应用。
  • 回收过程

    1. 初始标记:暂停所有用户线程,标记 GC Roots 直接关联的对象。
    2. 并发标记:允许用户线程继续运行,GC 线程从 GC Roots 开始遍历整个对象图。
    3. 重新标记:暂停所有用户线程,修正并发标记期间发生状态改变的对象。
    4. 并发清理:用户线程继续运行,GC 线程回收未标记的对象。
    5. 并发重置:重置标记状态,为下一次回收做准备。
  • 算法

    • 标记-清除算法,可能导致内存碎片问题。
  • 适用场景

    • 对响应时间敏感的应用(如 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 的影响。

觉得对您有帮助,麻烦 点点关注啦 ,您的关注是我创作的最大动力~ 🎯

相关推荐
2401_865439632 小时前
CSS中隐藏元素的多重技巧与应用场景
开发语言·前端·javascript
Cosolar3 小时前
AI Agent 记忆机制全景对比:OpenClaw vs QwenPaw vs Hermes vs HiClaw
人工智能·深度学习·语言模型·chatgpt·面试
雁迟3 小时前
第六章:for 循环与 while 循环语句
开发语言·r语言
二哈赛车手3 小时前
新人笔记---简易版AI实现以图搜图功能
java·人工智能·笔记·spring·ai
夕除3 小时前
spring boot 6
java·spring boot·后端
故事和你913 小时前
洛谷-【图论2-2】最短路1
开发语言·数据结构·c++·算法·动态规划·图论
csbysj20203 小时前
Git 工作流程
开发语言
johnrui3 小时前
JUC之AQS
java·开发语言·jvm
Full Stack Developme3 小时前
Spring 模块介绍
java·后端·spring