深入理解 Java 虚拟机的垃圾回收机制
Alex Chen | 2026-08-26T22:59:40 | Java
本文从 GC Roots 出发,系统梳理 JVM 中 Serial、Parallel、G1、ZGC 四大垃圾收集器的工作原理与调优策略。
# 深入理解 Java 虚拟机的垃圾回收机制 ## 一、为什么要关注 GC? 在生产环境中,不合理的 GC 配置会导致长时间的 Stop-The-World 停顿,严重影响接口响应时间。理解 GC 原理是 Java 工程师进阶的必修课。 ## 二、GC Roots 与可达性分析 JVM 使用可达性分析算法判断对象是否存活。以下对象可以作为 GC Roots: - 虚拟机栈中引用的对象 - 方法区中类静态属性引用的对象 - 方法区中常量引用的对象 - 本地方法栈中 JNI 引用的对象 ## 三、四大垃圾收集器对比 | 收集器 | 算法 | 适用场景 | 停顿时间 | |--------|------|----------|----------| | Serial | 复制/标记-整理 | 客户端模式 | 较长 | | Parallel | 复制/标记-整理 | 吞吐量优先 | 中等 | | G1 | 分区收集 | 大堆内存 | 可控 | | ZGC | 染色指针 | 超低延迟 | <10ms | ## 四、G1 调优实战 ```java // 推荐的 G1 启动参数 // -XX:+UseG1GC // -XX:MaxGCPauseMillis=200 // -XX:G1HeapRegionSize=16m // -XX:InitiatingHeapOccupancyPercent=45 // 监控 GC 日志 // -Xlog:gc*:file=gc.log:time,uptime,level,tags ``` 关键调优思路:先设定期望停顿时间,再观察 GC 日志中 Mixed GC 的频率和耗时,逐步调整 `InitiatingHeapOccupancyPercent`。 ## 五、总结 选择 GC 收集器没有银弹,需要根据业务场景(吞吐量 vs 延迟)做权衡。建议在预发布环境充分压测后再上线。