Java 垃圾回收机制详解(GC机制全解析)
一、前言
在 Java 面试中,垃圾回收机制(Garbage Collection, GC) 是高频考点之一。理解 GC 不仅有助于编写高性能代码,也能帮助定位内存泄漏、优化系统性能。
二、Java 内存区域概览
| 区域 | 作用 | 是否受GC管理 |
|---|---|---|
| 程序计数器 | 线程执行位置记录 | ❌ |
| JVM栈 | 方法调用栈帧 | ❌ |
| 堆 (Heap) | 对象实例与数组存储区域 | ✅ |
| 方法区(Metaspace) | 类元信息、静态变量、常量池 | ✅(部分) |
三、对象存活判断:如何确定垃圾?
可达性分析算法(Reachability Analysis) 是现代 JVM 的主流方法:
- 从 GC Roots 出发沿引用链寻找可达对象
- 不可达对象即为垃圾
- GC Roots 包括栈变量、静态变量、本地方法栈引用
四、垃圾回收算法分类
| 算法 | 思想 | 特点 | 适用 |
|---|---|---|---|
| 标记-清除 | 标记后清除未标记对象 | 实现简单、碎片多 | 老年代 |
| 复制算法 | 将存活对象复制到新空间 | 无碎片、效率高 | 新生代 |
| 标记-整理 | 标记后移动对象压缩空间 | 减少碎片 | 老年代 |
| 分代收集 | 根据生命周期分代管理 | 综合性能最佳 | 堆 |
五、堆的分代模型
堆被划分为新生代、老年代和元空间。新生代采用复制算法,老年代采用标记-整理算法。
六、常见的垃圾收集器
| 收集器 | 特点 | 适用场景 |
|---|---|---|
| Serial GC | 单线程、简单 | 客户端模式 |
| Parallel GC | 多线程、高吞吐 | 服务器默认 |
| CMS | 并发、低延迟 | Web 服务 |
| G1 | 区域化收集、可预测停顿 | 大内存应用 |
| ZGC / Shenandoah | 超低延迟(<10ms) | 高并发场景 |
七、GC 调优建议
- 分析 GC 日志,观察停顿时间和频率
- 合理设置堆大小 (-Xms, -Xmx)
- 选择合适的收集器
- 减少临时对象创建
- 使用对象池或软引用
八、面试常见问题
- 为什么不用引用计数?—— 无法处理循环引用
- Minor GC 与 Full GC 区别?—— 前者回收新生代,后者回收整个堆
- CMS 缺点?—— 浮动垃圾、碎片多
- G1 优势?—— 可预测停顿、并行并发
九、总结
Java GC 的核心是 自动化内存管理。从 Serial GC 到 ZGC,JVM 垃圾回收机制不断演进以实现低延迟与高吞吐。

浙公网安备 33010602011771号