今日主题:Java 垃圾回收机制与主流回收器实战

4 阅读1分钟

今日主题:Java 垃圾回收机制与主流回收器实战

分代收集理论

JVM 基于“弱分代假说”(绝大多数对象朝生夕死)将堆划分为新生代(Eden、Survivor0/1)和老年代。新对象诞生于 Eden,熬过 Minor GC 则移入 Survivor 区并增加年龄,默认 15 岁后晋升老年代。老年代满则触发 Full GC,成本高昂。

主流垃圾回收器

  • Serial / Parallel GC:Serial 是单线程版,适用于客户端;Parallel 是多线程吞吐量优先收集器,适合后台运算。
  • CMS (Concurrent Mark-Sweep):以低停顿为目标,大部分工作与用户线程并发。但采用标记-清除算法易产生内存碎片,且 CPU 并发开销大,在 JDK 14 后被标记为废弃。
  • G1 (Garbage-First):JDK 9 后默认回收器。将堆划分为多个 Region,兼顾吞吐量与低延迟,支持可预测停顿(-XX:MaxGCPauseMillis)。适合大内存、对延迟敏感的服务端应用。
  • ZGC:JDK 15 正式转正,通过染色指针读屏障技术实现亚毫秒级停顿,且停顿时间不随堆大小增长。JDK 21 推出的分代 ZGC(-XX:+ZGenerational)进一步提升了小对象回收效率。

GC 调优策略

  1. 堆大小:建议将 -Xms-Xmx 设为相同值,避免动态扩容带来的开销。
  2. 回收器选择:追求吞吐量选 Parallel;追求低延迟选 G1 或 ZGC;超大堆(TB 级)且要求极致低延迟首选 ZGC。
  3. 监控分析:务必开启 GC 日志(如 -Xlog:gc)进行监控,避免出现内存泄漏或频繁 Full GC。