垃圾回收概述
垃圾回收(Garbage Collection,GC)是 JVM 自动内存管理的核心能力。它负责识别不再使用的对象,并回收这些对象占用的内存。
# 1. GC 解决什么问题
在 C/C++ 中,开发者需要手动申请和释放内存。Java 把对象释放交给 JVM 管理,降低了内存管理复杂度。
GC 主要解决:
- 哪些对象不再使用。
- 什么时候回收。
- 如何回收。
- 如何减少回收对业务线程的影响。
# 2. GC 主要回收哪里
GC 主要管理 Java 堆。
堆中存放大多数对象实例和数组。对象不再被引用后,GC 可以回收它们。
方法区或元空间也可能发生类卸载,但日常说的 GC 通常主要指堆回收。
# 3. GC Roots
判断对象是否存活,现代 JVM 通常使用可达性分析。
从一组根对象出发,沿引用链向外搜索,能到达的对象是存活对象,不能到达的对象可以被回收。
常见 GC Roots:
- 虚拟机栈中的局部变量引用。
- 静态变量引用。
- 常量引用。
- JNI 引用。
- 正在运行线程相关对象。
- JVM 内部引用。
# 4. Stop The World
很多 GC 阶段需要暂停所有用户线程,这种暂停称为 Stop The World,简称 STW。
STW 期间:
- 业务线程暂停执行。
- JVM 执行垃圾回收相关工作。
- 应用响应时间可能抖动。
低延迟垃圾回收器的重要目标就是减少 STW 时间。
# 5. Minor GC、Major GC、Full GC
常见术语:
- Minor GC / Young GC:回收新生代。
- Major GC / Old GC:回收老年代,不同语境含义可能不同。
- Full GC:通常指回收整个堆,并可能涉及元空间等区域。
不同垃圾回收器日志术语不同,分析时要结合具体收集器和日志格式。
# 6. 吞吐量和延迟
GC 调优通常在吞吐量和延迟之间取舍。
吞吐量关注:
业务执行时间 / 总运行时间
延迟关注:
单次请求最大停顿、P99、P999 响应时间
批处理任务通常更重视吞吐量,在线交易系统通常更重视延迟。
# 7. GC 不是越少越好
GC 频率低不一定好。如果每次 GC 停顿很长,用户体验仍然很差。
GC 频率高也不一定坏。如果每次停顿很短,总体吞吐和延迟满足目标,也可以接受。
判断 GC 是否健康,要看:
- GC 次数。
- 单次停顿。
- 总停顿时间。
- 回收前后内存变化。
- 老年代增长趋势。
- 业务延迟影响。
# 8. 阶段小结
GC 的本质是自动内存管理。学习 GC 要先理解对象存活判断,再理解回收算法和收集器,最后结合 GC 日志和业务指标做分析。不要把 GC 调优理解为背参数,真正的调优必须建立在观测和证据之上。
# 9. GC 工作全流程
对象不断分配
│
▼
堆空间达到触发条件
│
▼
进入 GC
│
├─ 找 GC Roots
│
├─ 做可达性分析
│
├─ 标记存活对象
│
├─ 按算法回收或移动对象
│
├─ 更新引用关系
│
└─ 恢复应用线程执行
不同收集器的差异主要在:
- 哪些阶段需要 STW。
- 哪些阶段可以并发。
- 是否移动对象。
- 是否压缩内存。
- 如何控制停顿时间。
# 10. GC 指标怎么看
| 指标 | 含义 | 排障价值 |
|---|---|---|
| 分配速率 | 单位时间创建多少对象 | 判断对象 churn 是否过高 |
| 晋升速率 | 新生代对象进入老年代速度 | 判断 Survivor/老年代压力 |
| GC 频率 | 单位时间 GC 次数 | 判断内存是否紧张 |
| GC 停顿 | STW 耗时 | 判断对接口延迟影响 |
| GC 后水位 | 回收后堆占用 | 判断是否泄漏 |
| Full GC 次数 | 全堆回收频率 | 判断严重程度 |
健康的 GC 不是“没有 GC”,而是 GC 行为稳定、停顿可控、回收后水位可回落。
# 11. GC 与业务延迟的关系
请求进入
│
├─ 正常执行 20ms
│
├─ 中途发生 STW 300ms
│
└─ 用户感知 RT ≈ 320ms
所以分析延迟抖动时,要把接口 RT 曲线和 GC 日志按时间对齐。只看平均 RT 很容易掩盖 GC 尖刺对 P99 的影响。
# 12. Tips 快问快答
Q:GC 次数越少越好吗?
A:不一定。更重要的是总停顿时间、单次最大停顿、业务延迟影响和回收后内存趋势。
Q:Full GC 一定是坏事吗?
A:偶发 Full GC 不一定严重,但频繁 Full GC 或长时间 Full GC 必须关注。
Q:为什么 GC 后内存没有完全清零?
A:因为仍然存活的对象不会被回收,JVM 也不需要把堆清成 0。
Q:GC 调优第一步是什么?
A:开启并分析 GC 日志,建立基线,而不是直接改参数。