Java 10 垃圾收集器接口与 G1 并行 Full GC
JEP 304:垃圾收集器接口
Java 10 前,GC 实现分散在代码库中,难以替换隔离。JEP 304 引入统一 GC 接口,使替代 GC 实现可插拔,同时将 GC 代码与核心 VM 隔离,便于维护与新算法引入。
核心价值:
- 新 GC 算法开发无需侵入核心 VM 代码。
- 便于实验性/专用 GC(如 ZGC、Shenandoah 前身)集成。
- 代码库模块化,降低耦合。
JEP 307:G1 并行 Full GC
Java 9 引入 G1(Garbage First)收集器,设计目标避免 Full GC。但当并发线程回收跟不上分配速率时,G1 退化为单线程 标记-清理-压缩 Full GC,导致长停顿。
Java 10 优化:Full GC 回退时改用 并行标记-清理-压缩,利用多线程缩短最坏延迟。
线程数控制
java -XX:ParallelGCThreads=4 -XX:+UseG1GC YourApp
ParallelGCThreads:控制并行 GC 工作线程数,默认值基于 CPU 核心数计算。- 也可用
-XX:ConcGCThreads控制并发标记线程数。
对比总结
| 特性 | Java 9 G1 | Java 10 G1 |
|---|---|---|
| Full GC 算法 | 单线程 mark-sweep-compact | 并行 mark-sweep-compact |
| 最坏延迟 | 较高(大堆下明显) | 显著降低 |
| 并行度控制 | 仅并发阶段可控 | Full GC 也可控 |
实践建议
- 大堆(> 4GB)低延迟场景优先考虑 G1,并调优
ParallelGCThreads。 - Java 11+ 引入 ZGC、Shenandoah 等低延迟收集器,超大堆(> 100GB)或亚毫秒级目标可评估迁移。
- 监控 GC 日志(
-Xlog:gc*)观察 Full GC 频率与耗时,指导调优。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- Java 集合框架完全指南:接口、实现、算法与最佳实践
- Java 10 垃圾收集器接口与 G1 并行 Full GC
- Java 9 集合工厂方法:一行代码创建不可变 List/Set/Map