Administrator
发布于 2026-03-12 / 0 阅读
0
0

JDK 8常用的垃圾回收器种类 及应用场景

JDK 8常用的垃圾回收器种类 及应用场景

在 JDK 8 中,常用的垃圾回收器可以根据其作用的堆内存区域和特性进行分类,不同的垃圾回收器适用

于不同的应用场景,以下为你详细介绍:


1.新生代垃圾回收器

#### 1. Serial 收集器

  • 算法:复制算法。
  • 特点:单线程执行垃圾回收操作,在进行垃圾回收时,会暂停所有用户线程(Stop The World)。
  • 这种方式简单高效,因为没有线程切换的开销。

  • 应用场景:适用于单 CPU 环境下的客户端应用程序,或者对内存占用和停顿时间要求不高的小型
  • 应用。由于单线程工作,在多核环境下性能不如多线程收集器。

  • 启用参数:`-XX:+UseSerialGC`

  • #### 2. ParNew 收集器

  • 算法:复制算法。
  • 特点:Serial 收集器的多线程版本,在垃圾回收时使用多个线程并行工作,能够充分利用多核 CPU
  • 的优势,减少垃圾回收的时间。

  • 应用场景:常与 CMS 收集器配合使用,适用于对响应时间有一定要求的多 CPU 服务器应用。因为
  • 它可以在一定程度上减少停顿时间,提高应用的响应性能。

  • 启用参数:`-XX:+UseParNewGC`

  • #### 3. Parallel Scavenge 收集器

  • 算法:复制算法。
  • 特点:多线程并行收集,重点关注系统的吞吐量。吞吐量是指 CPU 用于运行用户代码的时间与
  • CPU 总消耗时间的比值。可以通过参数 `-XX:MaxGCPauseMillis` 和 `-XX:GCTimeRatio` 分别控制最大

    垃圾收集停顿时间和吞吐量大小。

  • 应用场景:适用于那些对吞吐量要求较高、对响应时间要求相对较低的应用,如后台数据处理任
  • 务、科学计算等。

  • 启用参数:`-XX:+UseParallelGC`

  • 2.老年代垃圾回收器

    #### 1. Serial Old 收集器

  • 算法:标记 - 整理算法。
  • 特点:单线程执行,主要作为 Serial 收集器在老年代的搭配,也可以作为 Parallel Scavenge 收集
  • 器的后备方案。在进行垃圾回收时,同样会暂停所有用户线程。

  • 应用场景:与 Serial 收集器类似,适用于单 CPU 环境或硬件资源受限的场景,或者作为其他收集
  • 器的备用方案。

  • 启用参数:一般与 Serial 收集器搭配使用 `-XX:+UseSerialGC`

  • #### 2. Parallel Old 收集器

  • 算法:标记 - 整理算法。
  • 特点:多线程并行收集,与 Parallel Scavenge 收集器配合使用,共同实现高吞吐量的目标。
  • 应用场景:适用于对吞吐量要求较高的服务器应用,特别是在多核 CPU 环境下,能够充分发挥多
  • 线程的优势,提高垃圾回收效率。

  • 启用参数:`-XX:+UseParallelOldGC`

  • #### 3. CMS(Concurrent Mark Sweep)收集器

  • 算法:标记 - 清除算法。
  • 特点:以获取最短回收停顿时间为目标,在垃圾收集过程中,尽量与用户线程并发执行,减少停顿
  • 时间。但会产生内存碎片,并且对 CPU 资源比较敏感。

  • 应用场景:适用于对响应时间要求较高的应用,如 Web 应用程序、实时系统等。这些应用需要尽可
  • 能减少垃圾回收对用户体验的影响。

  • 启用参数:`-XX:+UseConcMarkSweepGC`

  • 全堆垃圾回收器

    #### G1(Garbage - First)收集器(JDK 8u40 及以后版本可较好支持)

  • 算法:结合了标记 - 整理和复制算法。
  • 特点:将堆内存划分为多个大小相等的 Region,跟踪各个 Region 里垃圾的价值大小,优先回收价
  • 值最大的 Region,从而保证在有限的时间内获得尽可能高的收集效率。同时,它可以控制垃圾回收的停

    顿时间。

  • 应用场景:适用于大内存、多处理器的场景,特别是对垃圾回收停顿时间有严格要求的应用。例如
  • 大型企业级应用、数据库服务器等。

  • 启用参数:`-XX:+UseG1GC`

  • 在 JDK 8 里,不同垃圾回收器可组合使用,以满足不同应用场景的需求。下面为你介绍常见的组合及其

    适用场景:


    3.常见的组合及其适用场景

    Serial + Serial Old

  • 参数启用:使用 `-XX:+UseSerialGC` 可同时启用 Serial 收集器(用于新生代)和 Serial Old 收集器
  • (用于老年代)。

  • 工作原理:Serial 收集器在新生代采用复制算法,单线程执行垃圾回收;Serial Old 收集器在老年代
  • 使用标记 - 整理算法,同样单线程工作。在垃圾回收时,会暂停所有用户线程。

  • 适用场景:适用于单 CPU 环境下的客户端应用程序,或者硬件资源受限、对垃圾回收停顿时间不
  • 敏感的小型应用。因为单线程操作简单,无线程切换开销,在资源有限的情况下能保证一定的效率。


    Parallel Scavenge + Parallel Old

  • 参数启用:通过 `-XX:+UseParallelOldGC` 来启用该组合,Parallel Scavenge 负责新生代,采用复
  • 制算法;Parallel Old 处理老年代,使用标记 - 整理算法。

  • 工作原理:两者均为多线程并行收集,以提高系统吞吐量为目标。Parallel Scavenge 可通过 `-
  • XX:MaxGCPauseMillis` 和 `-XX:GCTimeRatio` 参数控制最大垃圾收集停顿时间和吞吐量。

  • 适用场景:适用于对吞吐量要求较高、对响应时间要求相对较低的应用,如后台数据处理任务、科
  • 学计算等。在多核 CPU 环境下,多线程并行收集能充分利用 CPU 资源,提升垃圾回收效率。


    ParNew + CMS

  • 参数启用:使用 `-XX:+UseConcMarkSweepGC` 启用此组合,ParNew 用于新生代,采用复制算
  • 法;CMS 用于老年代,基于标记 - 清除算法。

  • 工作原理:ParNew 是 Serial 收集器的多线程版本,能利用多核 CPU 优势并行进行新生代垃圾回
  • 收。CMS 以获取最短回收停顿时间为目标,在垃圾收集过程中尽量与用户线程并发执行,减少停顿。

  • 适用场景:适合对响应时间要求较高的应用,如 Web 应用程序、实时系统等。不过,CMS 会产生
  • 内存碎片,且对 CPU 资源敏感,CPU 核心数不足时可能影响性能。


    Parallel Scavenge + Serial Old(默认组合之一)

  • 参数启用:当使用 `-XX:+UseParallelGC` 时,新生代使用 Parallel Scavenge 收集器,老年代默认
  • 使用 Serial Old 收集器(JDK 8 中)。

  • 工作原理:Parallel Scavenge 在新生代多线程并行收集以提高吞吐量,Serial Old 在老年代单线程
  • 执行标记 - 整理操作。

  • 适用场景:如果应用对吞吐量有一定要求,但硬件资源或场景不适合使用 Parallel Old 收集器时会
  • 采用此组合。不过由于老年代单线程回收,在大内存和高并发场景下性能可能受限。


    G1 收集器(自成体系,可看作全堆处理组合)

  • 参数启用:使用 `-XX:+UseG1GC` 启用。虽然严格来说它不属于传统的组合,但它在一个收集器内
  • 对整个堆进行管理。

  • 工作原理:G1 将堆内存划分为多个大小相等的 Region,结合标记 - 整理和复制算法,跟踪各
  • Region 垃圾价值,优先回收价值大的 Region,可控制垃圾回收停顿时间。

  • 适用场景:适用于大内存、多处理器的场景,特别是对垃圾回收停顿时间有严格要求的应用,如大
  • 型企业级应用、数据库服务器等。


    jdk8默认的垃圾回收器

    垃圾回收器 PS Scavenge与 垃圾回收器 PS MarkSweep

    PS Scavenge 和 PS MarkSweep 是 Java 虚拟机中 Parallel Scavenge 收集器和 Parallel Old 收集器使用

    的垃圾回收算法,以下是对它们的详细介绍:


    在 Java 8 中,默认的垃圾回收器组合是 Parallel Scavenge(新生代使用 PS Scavenge 算法)和

    Parallel Old(老年代使用 PS MarkSweep 算法)。这种组合在追求高吞吐量的应用场景中表现出色,但

    在某些情况下,如对停顿时间要求非常严格的应用,可能需要考虑其他垃圾回收器组合。

    PS Scavenge

    所属收集器:Parallel Scavenge 收集器,是 JDK 8 及之前版本中新生代默认的垃圾回收器2。

    算法原理:采用复制算法,将新生代内存划分为 Eden 区和两个 Survivor 区(一般称为 From

    Survivor 和 To Survivor)。对象首先在 Eden 区分配内存,当 Eden 区满时,触发 Minor GC,把

    Eden 区和 From Survivor 区中存活的对象复制到 To Survivor 区,然后清空 Eden 区和 From

    Survivor 区。下次 GC 时,From Survivor 区和 To Survivor 区角色互换,如此循环。

    特点:

    吞吐量优先:以达到高吞吐量为目标,通过多线程并行回收,尽量减少垃圾回收所占用的时间,

    让程序有更多时间执行用户代码,适用于后台计算型应用,能高效利用 CPU 资源1。

    自适应调节策略:可以根据运行情况动态调整新生代的大小、Eden 区和 Survivor 区的比例等参

    数,以优化垃圾回收的性能。

    PS MarkSweep

    所属收集器:Parallel Old 收集器,是 Parallel Scavenge 收集器在老年代的搭档,用于回收老年代内

    存1。

    算法原理:基于标记 - 清除算法。首先标记出老年代中所有存活的对象,然后清除未被标记的对象,

    释放其占用的内存空间。

    特点:

    多线程并行:与 PS Scavenge 类似,采用多线程并行执行垃圾回收,能在较短时间内完成老年

    代的垃圾回收,减少停顿时间,提高系统的并发处理能力。

    适合大对象和长生命周期对象:老年代通常存放经过多次新生代 GC 后仍然存活的对象,这些对

    象一般占用空间较大、生命周期较长。PS MarkSweep 能够有效处理这些对象,避免在老年代频

    繁进行复制操作带来的性能开销。


    本文整理自实践经验,如有问题欢迎交流讨论。


    评论