Java 中默认使用的垃圾回收器及特点分版本说说?

1 个回答

  • 李慕婉
    快乐出现的时候,就好好享受快乐。
    ## **1. JDK 7(以及之前)** * **默认垃圾回收器**: * **新生代**:**Parallel Scavenge**(吞吐量优先收集器) * **老年代**:**Parallel Old** * **特点**: * **并行 GC**:多线程回收新生代和老年代,适合批处理、后台任务等吞吐量优先场景 * STW(Stop-The-World)时间相对较长 * 调优主要依赖 `-XX:MaxGCPauseMillis` 和 `-XX:GCTimeRatio` ## **2. JDK 8** * **默认垃圾回收器**:**Parallel GC**(新生代 Parallel Scavenge + 老年代 Parallel Old) * **特点**: * 吞吐量优先 * 新生代复制算法、老年代标记-整理算法 * 适合大内存、批量任务,不适合对延迟非常敏感的服务 * **备注**: * JDK 8 中 G1 GC 是可选(`-XX:+UseG1GC`),但不是默认 * 元空间(Metaspace)替代了永久代(PermGen) ## **3. JDK 9 \~ JDK 10** * **默认垃圾回收器**:**G1 GC**(Garbage First) * **特点**: * 面向低延迟:将堆划分为多个 Region,按优先级回收 * 可以预测停顿时间(`-XX:MaxGCPauseMillis`) * 混合回收(Mixed GC):一次回收新生代 + 部分老年代 * 减少了全堆 STW 的次数,但调优复杂度比 Parallel GC 高 ## **4. 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 数量 ## **5. JDK 17 \~ 现在** * **默认垃圾回收器**:**G1 GC**(依旧默认) * **特点更新**: * 继续优化停顿预测 * 并行化更多阶段 * 提供更多可选低延迟 GC: * **ZGC**(`-XX:+UseZGC`):毫秒级停顿,支持超大堆(TB 级) * **Shenandoah**(`-XX:+UseShenandoahGC`):低延迟,停顿时间与堆大小无关 * **趋势**:低延迟场景逐渐用 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 实现极低延迟 |
    发布于 2025-08-08 10:38 •IP属地 宁夏
    举报
    评论
    收藏