Java中默认使用的垃圾回收器及特点分版本?
Java中默认使用的垃圾回收器及特点分版本?
月伴飞鱼JDK 7(以及之前)
- 默认垃圾回收器:
- 新生代:Parallel Scavenge(吞吐量优先收集器)
- 老年代:Parallel Old
- 特点:
- 并行 GC:多线程回收新生代和老年代,适合批处理、后台任务等吞吐量优先场景。
- STW(Stop-The-World)时间相对较长。
- 调优主要依赖
-XX:MaxGCPauseMillis
和-XX:GCTimeRatio
。
JDK 8
- 默认垃圾回收器:Parallel GC(新生代 Parallel Scavenge + 老年代 Parallel Old)。
- 特点:
- 吞吐量优先。
- 新生代复制算法、老年代标记-整理算法。
- 适合大内存、批量任务,不适合对延迟非常敏感的服务。
- 备注:
- JDK 8 中 G1 GC 是可选(
-XX:+UseG1GC
),但不是默认。 - 元空间(Metaspace)替代了永久代(PermGen)。
- JDK 8 中 G1 GC 是可选(
JDK 9 ~ JDK 10
- 默认垃圾回收器:G1 GC(Garbage First)
- 特点:
- 面向低延迟:将堆划分为多个 Region,按优先级回收。
- 可以预测停顿时间(
-XX:MaxGCPauseMillis
)。 - 混合回收(Mixed GC):一次回收新生代 + 部分老年代。
- 减少了全堆 STW 的次数,但调优复杂度比 Parallel GC 高。
JDK 11 ~ JDK 16
- 默认垃圾回收器:依旧是 G1 GC。
- 特点更新:
- JDK 11:G1 增加并行 Full GC,减少单线程 Full GC 带来的长时间停顿。
- JDK 12:G1 支持 abortable mixed collections(可中断混合回收)。
- JDK 14:移除 CMS(Concurrent Mark-Sweep)GC。
- 调优建议:尽量通过
-XX:MaxGCPauseMillis
控制延迟,不盲目调 Region 数量。
JDK 17 ~ 现在
- 默认垃圾回收器:G1 GC(依旧默认)
- 特点更新:
- 继续优化停顿预测。
- 并行化更多阶段。
- 提供更多可选低延迟 GC:
- ZGC(
-XX:+UseZGC
):毫秒级停顿,支持超大堆(TB 级)。 - Shenandoah(
-XX:+UseShenandoahGC
):低延迟,停顿时间与堆大小无关。
- ZGC(
- 趋势:低延迟场景逐渐用 ZGC / Shenandoah,G1 作为通用型默认。
汇总表
JDK 版本 | 默认 GC | 特点 |
---|---|---|
7 及以前 | Parallel Scavenge + Parallel Old | 吞吐量优先,STW 时间长 |
8 | Parallel GC | 吞吐量优先,可选 G1 |
9 ~ 10 | G1 GC | 低延迟,分 Region 回收 |
11 ~ 16 | G1 GC | G1 优化更多并行、可预测停顿 |
17+ | G1 GC | 默认 G1,可选 ZGC/Shenandoah 实现极低延迟 |