在这里插入图片描述

Java面试题详解:常用的垃圾集合器有哪些?

问题背景

在 Java 虚拟机(JVM)中,垃圾收集器负责自动回收不再使用的内存对象。选择合适的垃圾收集器对系统性能至关重要,尤其是在高并发、大内存场景下。下面我将通过一个通俗的故事解释不同垃圾收集器的作用和特点,并结合实际代码示例说明。


📖 故事举例:“城市清洁工团队”

想象一个城市(JVM内存),居民(Java对象)每天产生大量垃圾(内存占用)。不同清洁工团队(垃圾收集器)负责清理垃圾:

  1. 串行收集器(Serial Collector)
    👨‍🦯 特点:单线程工作,像一位老爷爷推着小车挨家挨户收垃圾。
    ❌ 缺点:清理时全城暂停(Stop-The-World)。
    ✅ 适用:客户端程序或小内存应用(如手机APP)。

    // 启动参数:-XX:+UseSerialGC
    
  2. 并行收集器(Parallel/Throughput Collector)
    👷‍♂️ 特点:多线程团队,像一群清洁工分区同时打扫。
    ⚡ 优势:高吞吐量(单位时间清理更多垃圾)。
    ❌ 缺点:暂停时间较长。
    ✅ 适用:后台计算型应用(如数据分析)。

    // 启动参数:-XX:+UseParallelGC
    
  3. CMS收集器(Concurrent Mark Sweep)
    🚗 特点:边打扫边让居民活动,像清洁车在车流中作业。
    ️ 优势:低停顿时间(并发标记清除)。
    ❌ 缺点:内存碎片化,可能触发Full GC。
    ✅ 适用:Web服务器(如Tomcat)。

    // 启动参数:-XX:+UseConcMarkSweepGC
    
  4. G1收集器(Garbage-First)
    🗺️ 特点:将城市分成多个区域(Region),优先清理最脏的区域。
    🎯 优势:可预测停顿时间(默认200ms),适合大内存。
    ✅ 适用:JDK9+默认收集器(如云服务)。

    // 启动参数:-XX:+UseG1GC
    
  5. ZGC收集器(Z Garbage Collector)
    🚀 特点:使用染色指针技术,像无人机精准识别垃圾。
    ️ 优势:超低停顿10ms),支持TB级堆内存。
    ✅ 适用:金融交易系统或实时计算。

    // 启动参数:-XX:+UseZGC
    
  6. Shenandoah收集器
    🌉 特点:与ZGC类似,但使用读屏障而非染色指针。
    🔄 优势:跨Region引用处理更高效。
    ✅ 适用:Red Hat系系统(如OpenJDK)。

    // 启动参数:-XX:+UseShenandoahGC
    

📊 总结与选择建议

收集器 特点 适用场景 停顿时间
Serial 单线程,简单 客户端小应用
Parallel 高吞吐量 计算密集型任务 中等
CMS 低停顿,并发 Web服务 短(但有碎片)
G1 分区收集,平衡 大内存通用场景 可预测
ZGC/Shenandoah 超低停顿,TB级堆 实时系统 极短

💡 选择原则

  • 小内存/客户端 → Serial
  • 高吞吐需求 → Parallel
  • 低延迟Web服务 → CMS/G1
  • 大内存实时系统 → ZGC/Shenandoah

🧠 思维导图

在这里插入图片描述

✅ 关键结论

  1. 垃圾收集器是JVM性能的核心组件,直接影响延迟、吞吐量和内存占用。
  2. 现代应用首选G1/ZGC:平衡吞吐量和停顿时间,适合云原生环境。
  3. 监控工具不可或缺:使用jstatVisualVM观察GC行为,针对性调优。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐