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.jarZGC 改进
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.jarZGC 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.jarShenandoah 和 ZGC 的区别:
| 特性 | ZGC | Shenandoah |
|---|---|---|
| 停顿时间 | < 1ms | < 10ms |
| 堆内存 | TB 级 | GB 级 |
| JDK 正式版 | 15 | 12 |
| 并发重定位 | ✅ | ✅ |
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.jarGC 日志分析
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,是性能优化的重要一步。
