java垃圾收集器大纲
·
基础算法(理论层面)
| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 标记-清除(Mark-Sweep) | 标记存活对象,清除未标记 | 简单、不移动对象 | 内存碎片、效率低 |
| 标记-复制(Mark-Copy) | 存活对象复制到另一块内存 | 无碎片、高效 | 内存利用率仅 50% |
| 标记-整理(Mark-Compact) | 存活对象向一端移动,清理边界外 | 无碎片、内存利用率高 | 移动对象开销大、STW 长 |
垃圾回收器分类
1. 分代收集器
| 回收器 | 新生代算法 | 老年代算法 | 特点 | 适用场景 |
|---|---|---|---|---|
| Serial | 复制 | 整理 | 单线程、STW | 客户端/嵌入式 |
| ParNew | 复制(并行) | — | Serial 的多线程版 | 配合 CMS 使用 |
| Parallel Scavenge | 复制(并行) | 整理 | 吞吐量优先 | 后台计算/批处理 |
| Parallel Old | — | 整理(并行) | Parallel 的老年代版 | 同上 |
2.低延迟收集器(并发标记)
| 回收器 | 算法 | 核心设计 | 优点 | 缺点 |
|---|---|---|---|---|
| CMS(Concurrent Mark Sweep) | 标记-清除 | 并发标记、并发清除 | 低延迟 | 内存碎片、浮动垃圾、并发失败退化为 Serial Old |
| G1(Garbage First) | 标记-整理 + 复制 | Region 分区、优先回收垃圾最多区 | 可预测停顿、平衡吞吐与延迟 | 内存开销略大 |
G1 关键参数:-XX:MaxGCPauseMillis=200(目标最大停顿 200ms)
3.新一代低延迟收集器(ZGC / Shenandoah)
| 回收器 | 算法 | 核心设计 | 目标停顿 | JDK 版本 |
|---|---|---|---|---|
| ZGC | 标记-复制 + 染色指针 | 并发整理、读屏障、染色指针 | < 10ms | JDK 11+(生产可用),JDK 15+ 稳定 |
| Shenandoah | 标记-复制 + Brooks 指针 | 并发标记、并发整理、读屏障 | < 10ms | JDK 12+(Red Hat 主导) |
| Epsilon | 不回收 | 仅分配不回收,用于性能测试 | — | JDK 11+ |
核心对比
| 维度 | Parallel | CMS | G1 | ZGC / Shenandoah |
|---|---|---|---|---|
| 设计目标 | 吞吐量 | 低延迟 | 平衡 | 超低延迟 |
| 最大堆 | 无限制 | 较小 | 数十 GB | TB 级 |
| 典型停顿 | 数百 ms~数 s | 几十~几百 ms | 几十~几百 ms | < 10ms |
| 内存碎片 | 无 | 严重 | 可控 | 无 |
| 并发能力 | 无 | 部分 | 部分 | 全并发 |
| JDK 推荐 | JDK 8 默认 | 已废弃(JDK 14) | JDK 9+ 默认 | JDK 17+ 推荐 |
更多推荐
所有评论(0)