Skip to content

GC 增强

JDK 17 对垃圾收集器做了大量改进,让 GC 更加智能和高效。

G1 改进

并行标记

G1 的并发标记阶段在 JDK 17 得到了优化,减少了停顿时间:

bash
# JDK 17 改进了并发标记效率
java -XX:+UseG1GC -Xms4g -Xmx4g -jar app.jar

可中断混合回收

当停顿时间接近目标时,G1 可以中断混合回收:

bash
# JDK 17+:G1 会动态调整回收量以满足停顿时间目标
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -jar app.jar

记忆集改进

记忆集(Remembered Set)用于跟踪跨区域引用,JDK 17 减少了其内存开销:

bash
# JDK 17 减少了 RSet 内存占用
java -XX:+UseG1GC -Xms8g -Xmx8g -jar app.jar

ZGC 改进

JDK 17 进一步优化了 ZGC:

bash
# JDK 17 的 ZGC 改进
java -XX:+UseZGC -Xms8g -Xmx8g -jar app.jar

并发线程栈处理

JDK 17 改进了线程栈的并发处理,减少了停顿时间:

bash
# JDK 17+:减少了 GC 线程栈扫描的开销
java -XX:+UseZGC -XX:+ParallelRefProcEnabled -jar app.jar

ZGC vs G1 选择

场景推荐 GC
低延迟敏感(< 1ms)ZGC
大内存(> 8GB)ZGC
通用场景G1
吞吐量优先Parallel GC
小内存(< 4GB)G1 或 Serial

Shenandoah GC

JDK 17 也支持 Shenandoah GC:

bash
# Shenandoah:另一个低延迟收集器
java -XX:+UseShenandoahGC -Xms4g -Xmx4g -jar app.jar

Shenandoah 和 ZGC 的区别:

特性ZGCShenandoah
停顿时间< 1ms< 10ms
堆内存TB 级GB 级
JDK 正式版1512
并发重定位

GC 配置建议

通用配置

bash
# 大多数场景:G1
java -Xms4g -Xmx4g -XX:+UseG1GC -jar app.jar

低延迟配置

bash
# 延迟敏感:ZGC
java -Xms8g -Xmx8g \
     -XX:+UseZGC \
     -XX:MaxGCPauseMillis=1 \
     -jar app.jar

生产配置

bash
# 生产环境
java -Xms8g -Xmx8g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:+ParallelRefProcEnabled \
     -Xlog:gc*:file=gc.log \
     -jar app.jar

GC 日志分析

bash
# 开启详细 GC 日志
java -Xlog:gc*=debug:file=gc.log \
     -XX:+UseG1GC \
     -jar app.jar

# 使用 jstat 监控
jstat -gcutil <pid> 1000

小结

JDK 17 的 GC 改进让 Java 应用更加稳定和高效:

  • G1:默认收集器,持续优化
  • ZGC:< 1ms 停顿时间,TB 级堆
  • Shenandoah:另一个低延迟选择
  • Parallel GC:追求吞吐量

根据应用特点选择合适的 GC,是性能优化的重要一步。

基于 VitePress 构建