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 提供更优的延迟选项。
posted @ 2024-12-11 11:51  Eiffelzero  阅读(541)  评论(0)    收藏  举报