【Java-JVM】常用的垃圾收集器有哪些?

Java面试题详解:常用的垃圾集合器有哪些?
问题背景
在 Java 虚拟机(JVM)中,垃圾收集器负责自动回收不再使用的内存对象。选择合适的垃圾收集器对系统性能至关重要,尤其是在高并发、大内存场景下。下面我将通过一个通俗的故事解释不同垃圾收集器的作用和特点,并结合实际代码示例说明。
📖 故事举例:“城市清洁工团队”
想象一个城市(JVM内存),居民(Java对象)每天产生大量垃圾(内存占用)。不同清洁工团队(垃圾收集器)负责清理垃圾:
-
串行收集器(Serial Collector)
👨🦯 特点:单线程工作,像一位老爷爷推着小车挨家挨户收垃圾。
❌ 缺点:清理时全城暂停(Stop-The-World)。
✅ 适用:客户端程序或小内存应用(如手机APP)。// 启动参数:-XX:+UseSerialGC -
并行收集器(Parallel/Throughput Collector)
👷♂️ 特点:多线程团队,像一群清洁工分区同时打扫。
⚡ 优势:高吞吐量(单位时间清理更多垃圾)。
❌ 缺点:暂停时间较长。
✅ 适用:后台计算型应用(如数据分析)。// 启动参数:-XX:+UseParallelGC -
CMS收集器(Concurrent Mark Sweep)
🚗 特点:边打扫边让居民活动,像清洁车在车流中作业。
️ 优势:低停顿时间(并发标记清除)。
❌ 缺点:内存碎片化,可能触发Full GC。
✅ 适用:Web服务器(如Tomcat)。// 启动参数:-XX:+UseConcMarkSweepGC -
G1收集器(Garbage-First)
🗺️ 特点:将城市分成多个区域(Region),优先清理最脏的区域。
🎯 优势:可预测停顿时间(默认200ms),适合大内存。
✅ 适用:JDK9+默认收集器(如云服务)。// 启动参数:-XX:+UseG1GC -
ZGC收集器(Z Garbage Collector)
🚀 特点:使用染色指针技术,像无人机精准识别垃圾。
️ 优势:超低停顿10ms),支持TB级堆内存。
✅ 适用:金融交易系统或实时计算。// 启动参数:-XX:+UseZGC -
Shenandoah收集器
🌉 特点:与ZGC类似,但使用读屏障而非染色指针。
🔄 优势:跨Region引用处理更高效。
✅ 适用:Red Hat系系统(如OpenJDK)。// 启动参数:-XX:+UseShenandoahGC
📊 总结与选择建议
| 收集器 | 特点 | 适用场景 | 停顿时间 |
|---|---|---|---|
| Serial | 单线程,简单 | 客户端小应用 | 长 |
| Parallel | 高吞吐量 | 计算密集型任务 | 中等 |
| CMS | 低停顿,并发 | Web服务 | 短(但有碎片) |
| G1 | 分区收集,平衡 | 大内存通用场景 | 可预测 |
| ZGC/Shenandoah | 超低停顿,TB级堆 | 实时系统 | 极短 |
💡 选择原则:
- 小内存/客户端 → Serial
- 高吞吐需求 → Parallel
- 低延迟Web服务 → CMS/G1
- 大内存实时系统 → ZGC/Shenandoah
🧠 思维导图

✅ 关键结论
- 垃圾收集器是JVM性能的核心组件,直接影响延迟、吞吐量和内存占用。
- 现代应用首选G1/ZGC:平衡吞吐量和停顿时间,适合云原生环境。
- 监控工具不可或缺:使用
jstat、VisualVM观察GC行为,针对性调优。
更多推荐


所有评论(0)