🔴 垃圾回收器概述 #JVM/垃圾回收器
🔴 垃圾回收器是JVM中负责自动内存管理的核心组件,通过不同的算法和策略实现堆内存的自动回收,确保Java程序的内存安全。不同的垃圾回收器适用于不同的应用场景和性能需求。
🟠 垃圾回收器分类体系
🟢 1. 按代际分类
- 🟢 新生代收集器:Serial、ParNew、Parallel Scavenge、G1
- 🟢 老年代收集器:Serial Old、Parallel Old、CMS、G1
- 🟢 全堆收集器:G1、ZGC、Shenandoah
🟡 2. 按算法分类
- 🟡 复制算法:Serial、ParNew、Parallel Scavenge
- 🟡 标记清除算法:CMS
- 🟡 标记整理算法:Serial Old、Parallel Old
- 🟡 分代收集算法:G1、ZGC
🟠 3. 按并发性分类
- 🟠 串行收集器:Serial、Serial Old
- 🟠 并行收集器:ParNew、Parallel Scavenge、Parallel Old
- 🟠 并发收集器:CMS、G1、ZGC
🟠 垃圾回收器对比一览
收集器 | 代际 | 算法 | 并发/并行 | 关注点 | STW 停顿 | 吞吐量 | 延迟 | 典型场景 | 备注 |
---|---|---|---|---|---|---|---|---|---|
Serial | 新生代 | 复制 | 串行 | 简单稳定 | 较长 | 中 | 中 | 小堆、客户端 | 客户端默认 |
Serial Old | 老年代 | 标记整理 | 串行 | 稳定 | 较长 | 中 | 中 | 小堆、回退 | 与PS/回退配合 |
ParNew | 新生代 | 复制 | 并行 | 多核利用 | 中 | 高 | 中 | CMS 搭档、Web | 多线程新生代 |
Parallel Scavenge | 新生代 | 复制 | 并行 | 吞吐量 | 中 | 很高 | 一般 | 批处理/计算密集 | 自适应调优 |
Parallel Old | 老年代 | 标记整理 | 并行 | 吞吐量 | 中 | 很高 | 一般 | 批处理/服务端 | 与PS配套 |
CMS | 老年代 | 标记清除 | 并发 | 低停顿 | 短 | 中 | 低 | 交互/Web | 碎片、浮动垃圾 |
G1 | 全堆 | 分区化(复制/整合) | 并发+并行 | 可预测停顿 | 短 | 高 | 低~中 | 大堆、混合负载 | Region 化 + 停顿目标 |
ZGC | 全堆 | 并发着色/重定位 | 高并发 | 极低延迟 | 极短(<10ms) | 中 | 极低 | 超大堆、低延迟 | 需新JDK |
🟡 各收集器速览(单行记忆)
- 🔴 Serial:新生代/复制/串行;小堆客户端,停顿较长。
- 🔴 Serial Old:老年代/标整/串行;回退或小堆稳定方案。
- 🔴 ParNew:新生代/复制/并行;CMS 搭档,利用多核降停顿。
- 🔴 Parallel Scavenge:新生代/复制/并行;吞吐量优先,自适应调优。
- 🔴 Parallel Old:老年代/标整/并行;与PS配套,吞吐量优先。
- 🔴 CMS:老年代/标清/并发;低停顿但有碎片与浮动垃圾。
- 🔴 G1:全堆/Region化/并发+并行;可预测停顿,适合大堆。
- 🔴 ZGC:全堆/并发重定位/高并发;<10ms 停顿,超大堆低延迟。
🟠 垃圾回收器选择策略
🟡 1. 按应用类型选择
- 🟡 客户端应用:Serial + Serial Old
- 🟡 服务端应用:Parallel Scavenge + Parallel Old
- 🟡 低延迟应用:ParNew + CMS 或 G1
- 🟡 超大堆应用:G1 或 ZGC
🟡 2. 按性能需求选择
- 🟡 高吞吐量:Parallel Scavenge + Parallel Old
- 🟡 低延迟:CMS 或 G1
- 🟡 极低延迟:ZGC
- 🟡 平衡性能:G1