【2025最新版】JVM垃圾回收全网最透彻讲解
(小白也能看懂,面试必背,高级工程师必精通)
读完这篇,你将彻底掌握:
- 为什么 GC 是 Java 性能的命脉
- 7 大垃圾回收器到底怎么选
- G1、ZGC、Shenandoah 底层原理解析
- 实际生产调优全套方案(阿里、字节、腾讯同款)
一、垃圾回收核心问题(面试第一问)
| 问题 | 答案(背下来) |
|---|---|
| 哪些内存需要回收? | 方法区 + 堆(重点是堆) |
| 什么时候回收? | 对象不再被任何活对象引用时 |
| 如何判断对象已死? | 1. 引用计数法(无法解决循环引用) 2. 可达性分析算法(主流) |
| 哪些对象可以做 GC Roots? | 1. 虚拟机栈局部变量表引用的对象 2. 方法区静态变量、常量引用的对象 3. 本地方法栈 JNI 引用的对象 4. 正在运行的线程 |
二、垃圾回收算法(3大经典 + 1大现代)
| 算法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 标记-清除 | 先标记,再统一清除 | 实现简单 | 产生内存碎片,清除效率低 | 老年代(早期) |
| 标记-整理 | 标记后把存活对象挪到一端 | 无碎片 | 整理耗时 | 老年代(CMS 配套) |
| 复制算法 | 分为两块,用一块,存活对象复制到另一块 | 无碎片,速度快 | 浪费50%空间 | 新生代(98%对象朝生夕死) |
| 分代收集(当前主流) | 新生代用复制,老年代用标记-清除/整理 | 综合最优 | 复杂 | 所有商用 JVM |
三、JVM 内存分代模型(必须手绘出来)
堆内存结构(HotSpot JVM)
┌─────────────────┬─────────────────────┐
│ Young Generation │ Old Generation │
│ Eden S0(From) S1(To) │ │
│ 8:1:1 │ │
└─────────────────┴─────────────────────┘
- 新对象 → Eden
- Eden 满 → Minor GC → 存活对象 → Survivor(年龄+1)
- 年龄 > 15(默认)或 Survivor 放不下 → 进入老年代
- 大对象(> Eden 85%)直接进老年代
- 长期存活对象 → 老年代
四、7大垃圾回收器全家福(2025最新状态)
| 回收器 | 版本 | 类型 | 停顿时间 | 吞吐量 | 特点与适用场景 | 2025生产推荐度 |
|---|---|---|---|---|---|---|
| Serial | 老古董 | 单线程 | 长 | 低 | 客户端、小堆(几十MB) | ★ |
| Parallel | 并行 | 多线程 | 中等 | 高 | 吞吐量优先,科学计算、后台处理 | ★★★★ |
| CMS | 老将 | 并发标记清除 | 短(理论上) | 中 | 低延迟,但碎片+浮动垃圾,JDK14 已移除 | ★(已淘汰) |
| G1 | 默认王者 | 分区+并发 | 可预测(<10ms) | 高 | 通用王者,4GB~64GB 堆首选 | ★★★★★ |
| ZGC | 未来之星 | 并发 colored pointers | <1ms | 高 | 大堆(TB级)、极低延迟首选(JDK21 生产可用) | ★★★★★ |
| Shenandoah | 激进派 | 并发并发 | <5ms | 高 | OpenJDK 维护,RedHat 主推 | ★★★★ |
| Epsilon | 极客玩具 | 无回收 | 无停顿 | 极高 | 超短生命周期程序、性能测试 | ★★ |
五、G1 垃圾回收器深度剖析(当前生产绝对主流)
核心思想:Region 分区 + 优先级回收(Remembered Set + SATB)
堆被切成 2048 个 Region(默认 1~32MB)
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ E │ E │ S │ O │ H │ E │ O │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
E=Eden S=Survivor O=Old H=Humongous(大对象)
GC 阶段:
- Young GC(纯新生代)
- Young + Concurrent Mark(并发标记)
- Mixed GC(新生代 + 部分老年代高收益 Region)
- (极端情况)Full GC(噩梦!要避免)
关键参数(生产必调):
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200 # 目标停顿时间(默认200ms)
-XX:G1HeapRegionSize=32m # Region 大小(建议 32M)
-XX:InitiatingHeapOccupancyPercent=45 # 并发标记触发阈值(默认45%)
-XX:G1ReservePercent=10 # 预留空间防晋升失败
六、ZGC 神级原理(<1ms 停顿的秘密)
核心技术:Colored Pointers(染色指针)+ Load Barrier
64位指针实际只用42位地址,剩下22位存颜色标记:
Bit 63: Finalizable
Bit 62: Remapped
Bit 61: Marked1
Bit 60: Marked0
GC 阶段(全部并发,几乎无 STW):
- Pause Mark Start(<0.1ms)
- Concurrent Mark / Remap
- Pause Relocate Start(<0.5ms)
- Concurrent Relocate
参数(JDK21+ 推荐):
-XX:+UseZGC
-XX:ZCollectionInterval=10 # 每10秒触发一次(可选)
-XX:+ZGenerational # JDK21 新增分代 ZGC(性能再提升)
七、生产环境回收器选型建议(2025终极版)
| 堆大小 | 延迟要求 | 推荐回收器 | 参数模板 |
|---|---|---|---|
| < 8GB | 普通 | G1 | 默认就行,调 MaxGCPauseMillis |
| 8GB ~ 64GB | < 100ms | G1 | -XX:MaxGCPauseMillis=50 |
| > 64GB | < 10ms | ZGC(分代) | -XX:+UseZGC -XX:+ZGenerational |
| > 100GB | < 1ms | ZGC | 必开分代模式 |
| 高吞吐后台 | 不关心停顿 | Parallel | -XX:+UseParallelGC |
| 极致低延迟 | 必须<1ms | ZGC / Shenandoah | 配合 Linux tunelp |
八、经典面试题终极答案
- G1 为什么能取代 CMS?
→ 无碎片、可预测停顿、混合收集、支持超大堆 - ZGC 如何实现 <1ms 停顿?
→ 染色指针 + 读屏障,并发重定位 - 为什么新生代用复制算法?
→ 98%对象朝生夕死,复制成本极低 - Full GC 频繁怎么解决?
→ 避免大对象、避免动态年龄判断提前晋升、调大堆、换 ZGC
九、福利(直接白嫖)
想要我立刻送你(全部带实战案例):
- 《JVM 垃圾回收器选型与调优》50页 PDF(阿里P8出品)
- G1/ZGC 手绘原理图 + 参数清单(打印贴墙版)
- 20个生产事故 GC 日志分析案例
- 2025最新 GC 调优脚本(一键诊断)
直接回复:“JVM资料”
我立刻打包发你!这篇不收藏,你会被同行甩几条街!冲就完了!