Java 中常见的垃圾收集器有哪些?
Java 中常见的垃圾收集器
Java 提供了多种垃圾收集器(Garbage Collector, GC),每种收集器针对不同的应用场景和需求进行了优化。以下是常见的垃圾收集器及其特点。
1. Serial 收集器
特点
- 单线程工作,适合单核 CPU 环境。
- 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
- 优点:
- 简单高效,在小型应用中性能稳定。
- 缺点:
- 停顿时间长(STW 明显),不适合多线程环境。
使用场景
- 单线程程序或小型 Java 应用。
2. Parallel 收集器
特点
- 多线程并行收集,适合多核 CPU。
- 新生代使用 复制算法,老年代使用 标记-整理算法。
- 可通过
-XX:ParallelGCThreads参数设置并行线程数。 - 优点:
- 注重吞吐量(即减少 GC 总时间)。
- 缺点:
- 对暂停时间要求较高的场景不适合。
使用场景
- 后台处理任务,注重吞吐量的应用。
3. CMS(Concurrent Mark-Sweep)收集器
特点
- 以 低延迟 为目标的收集器。
- 使用 标记-清除算法。
- 优点:
- GC 与用户线程并发执行,降低停顿时间。
- 缺点:
- 会产生内存碎片。
- 对 CPU 资源敏感,并发阶段可能影响性能。
使用场景
- 对响应时间要求高的应用,如 Web 服务。
4. G1(Garbage First)收集器
特点
- 将堆内存划分为多个固定大小的区域(Region)。
- 采用 分区算法,优先回收垃圾最多的区域。
- 优点:
- 控制停顿时间,通过
-XX:MaxGCPauseMillis设置最大停顿时间。 - 减少全堆扫描,内存碎片少。
- 控制停顿时间,通过
- 缺点:
- 实现复杂,调优成本较高。
使用场景
- 大型内存、多核 CPU、高实时性要求的应用。
5. ZGC(Z Garbage Collector)
特点
- 极低延迟(停顿时间通常在 10ms 以下)。
- 支持大堆内存(最大支持 16TB)。
- 使用 标记-复制算法。
- 优点:
- 停顿时间与堆大小无关。
- 高效处理大内存场景。
- 缺点:
- CPU 开销较高。
使用场景
- 超大内存应用,对延迟敏感的系统。
6. Shenandoah 收集器
特点
- 目标是实现 低延迟 和 高吞吐量 的平衡。
- 使用并发压缩技术减少停顿时间。
- 优点:
- 停顿时间更低(与 G1 相比)。
- 缺点:
- 适配性不如 G1。
使用场景
- 需要更低停顿时间的高性能系统。
7. 总结
| 收集器 | 算法 | 目标 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| Serial | 标记-复制/标记-整理 | 高吞吐量 | 简单稳定 | 单线程,停顿时间长 | 单线程、小型应用 |
| Parallel | 标记-复制/标记-整理 | 高吞吐量 | 并行收集,性能高 | 停顿时间较长 | 多线程任务,注重吞吐量 |
| CMS | 标记-清除 | 低延迟 | 并发执行,响应时间快 | 内存碎片,CPU 开销大 | 响应时间敏感的服务 |
| G1 | 分区算法 | 低停顿 | 控制停顿时间,减少碎片 | 调优复杂 | 大内存、高实时性应用 |
| ZGC | 标记-复制 | 极低延迟 | 停顿时间与堆大小无关 | CPU 消耗大 | 超大内存,低延迟系统 |
| Shenandoah | 并发标记-整理 | 低延迟 | 更低停顿时间 | 实现复杂,适配性较弱 | 低延迟高性能系统 |
- 现代 Java 默认推荐使用 G1 收集器,JDK 11 开始 ZGC 和 Shenandoah 提供更优的延迟选项。

浙公网安备 33010602011771号