最近找工作,之前加班火气大,加上吃错药,休息了几个月!总结别随意吃寒凉药,本来就虚,工作随之 GG。休息了段时间,老问这个 JVM。所以今天我们来聊聊 JVM(Java 虚拟机)的垃圾收集器(Garbage Collector,简称 GC)。
很多人一听到“垃圾回收”就头疼,觉得又是 CMS、又是 G1、又是 ZGC……名字多、参数杂、原理难。
别担心!今天我用 极简 + 类比 + 口诀 的方式,帮你轻松记住主流垃圾收集器的核心特点!
🧠 一句话理解垃圾回收
GC 就是 JVM 的“保洁阿姨”——她负责打扫堆内存里的“垃圾对象”,好腾出空间给新对象住。
🗺️ 垃圾收集器全图速览(截至 JDK 17)
| 分代 | 新生代收集器 | 老年代收集器 |
|---|---|---|
| 经典组合 | Serial、ParNew、Parallel Scavenge | Serial Old、Parallel Old、CMS |
| 统一收集器 | — | G1、ZGC、Shenandoah |
✅ 注意:JDK 8 及以前常用“分代收集”,JDK 9+ 推荐用 G1,JDK 11+ 开始支持 ZGC/Shenandoah。
🧩 四大“保洁阿姨”风格(容易记!)
1. Serial(串行阿姨) → “一个人干活,安静高效”
- 特点:单线程,停顿全场(Stop-The-World)
- 适用:小型应用、客户端程序、内存小(<100MB)
- 口诀:“单干小能手,省电又省心”
2. Parallel(并行阿姨) → “全家总动员,干得快但吵”
- 新生代叫 Parallel Scavenge,老年代叫 Parallel Old
- 特点:多线程并行,吞吐量高(适合后台计算)
- 目标:最大化 CPU 利用率,适合“跑批任务”
- 口诀:“人多力量大,吞吐顶呱呱”
3. CMS(并发阿姨) → “边干活边打扫,怕吵用户”
- 全名:Concurrent Mark Sweep(并发标记清除)
- 特点:尽量和用户线程并发运行,低延迟
- 缺点:占用 CPU、会产生内存碎片、JDK 14 被移除!
- 口诀:“并发打扫快,碎片它不睬”
⚠️ 记住:CMS 是“尽力而为”,但可能失败(会退化成 Serial Old)!
4. G1(分区阿姨) → “划区管理,又快又稳”
- G1 = Garbage First
- 特点:
- 把堆分成 多个小区域(Region)
- 优先回收垃圾最多的区域(“垃圾优先”)
- 可预测停顿时间(比如“最大停顿200ms”)
- 适用:大堆(4GB~几十GB)、需要低延迟 + 高吞吐平衡
- 口诀:“分区垃圾先,停顿可预言”
✅ JDK 9 起默认 GC!
5. ZGC / Shenandoah(超新星阿姨) → “几乎不停顿!”
- 目标:停顿时间 < 10ms,即使堆有 TB 级!
- 原理:并发压缩 + 指针着色(ZGC) / 并发复制(Shenandoah)
- 适用:超大堆、实时系统(如金融交易、游戏服务器)
- 口诀:“ZGC 闪电侠,停顿看不见!”
📌 ZGC 从 JDK 11 开始实验,JDK 15 转正;Shenandoah 需 OpenJDK(Oracle JDK 不包含)。
🧠 终极记忆口诀(背这一段就够了!)
“小用 Serial,吞用 Parallel,
低延选 CMS(已淘汰),
平衡用 G1,
超快上 ZGC!”
🔚 总结:如何选 GC?
| 场景 | 推荐 GC |
|---|---|
| 小程序、测试 | Serial |
| 后台计算、吞吐优先 | Parallel |
| 老项目(JDK 8) | CMS(但建议迁移到 G1) |
| 通用生产环境(JDK 8~17) | G1 ✅ |
| 超大堆 + 超低延迟(JDK 11+) | ZGC / Shenandoah |
希望这篇博客让你 轻松记住 JVM 垃圾收集器!
下次面试被问到 GC,你可以笑着说:“哦,就是那几位保洁阿姨嘛~”
💡 小贴士:实际调优时,先用默认 GC(G1),再根据监控(如 GC 日志、Prometheus)调整,不要过早优化!
作者:一个爱用比喻记技术的程序员
发布时间:2025年
标签:#JVM #GC #Java #性能调优 #程序员入门
2478

被折叠的 条评论
为什么被折叠?



