【大白话说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 的影响。

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

相关推荐
niucloud-admin30 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
专注仿真38 分钟前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
霸道流氓气质1 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
jimy11 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
captain3761 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫122 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心中有你02142 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
心疼你的一切2 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
步行cgn2 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
每天进步一点点km3 小时前
自用-牛客网-华为机试编程模拟题1-python
华为od·华为·面试