JDK 8常用的垃圾回收器种类 及应用场景
在 JDK 8 中,常用的垃圾回收器可以根据其作用的堆内存区域和特性进行分类,不同的垃圾回收器适用
于不同的应用场景,以下为你详细介绍:
1.新生代垃圾回收器
#### 1. Serial 收集器
这种方式简单高效,因为没有线程切换的开销。
应用。由于单线程工作,在多核环境下性能不如多线程收集器。
#### 2. ParNew 收集器
的优势,减少垃圾回收的时间。
它可以在一定程度上减少停顿时间,提高应用的响应性能。
#### 3. Parallel Scavenge 收集器
CPU 总消耗时间的比值。可以通过参数 `-XX:MaxGCPauseMillis` 和 `-XX:GCTimeRatio` 分别控制最大
垃圾收集停顿时间和吞吐量大小。
务、科学计算等。
2.老年代垃圾回收器
#### 1. Serial Old 收集器
器的后备方案。在进行垃圾回收时,同样会暂停所有用户线程。
器的备用方案。
#### 2. Parallel Old 收集器
线程的优势,提高垃圾回收效率。
#### 3. CMS(Concurrent Mark Sweep)收集器
时间。但会产生内存碎片,并且对 CPU 资源比较敏感。
能减少垃圾回收对用户体验的影响。
全堆垃圾回收器
#### G1(Garbage - First)收集器(JDK 8u40 及以后版本可较好支持)
值最大的 Region,从而保证在有限的时间内获得尽可能高的收集效率。同时,它可以控制垃圾回收的停
顿时间。
大型企业级应用、数据库服务器等。
在 JDK 8 里,不同垃圾回收器可组合使用,以满足不同应用场景的需求。下面为你介绍常见的组合及其
适用场景:
3.常见的组合及其适用场景
Serial + Serial Old
(用于老年代)。
使用标记 - 整理算法,同样单线程工作。在垃圾回收时,会暂停所有用户线程。
敏感的小型应用。因为单线程操作简单,无线程切换开销,在资源有限的情况下能保证一定的效率。
Parallel Scavenge + Parallel Old
制算法;Parallel Old 处理老年代,使用标记 - 整理算法。
XX:MaxGCPauseMillis` 和 `-XX:GCTimeRatio` 参数控制最大垃圾收集停顿时间和吞吐量。
学计算等。在多核 CPU 环境下,多线程并行收集能充分利用 CPU 资源,提升垃圾回收效率。
ParNew + CMS
法;CMS 用于老年代,基于标记 - 清除算法。
收。CMS 以获取最短回收停顿时间为目标,在垃圾收集过程中尽量与用户线程并发执行,减少停顿。
内存碎片,且对 CPU 资源敏感,CPU 核心数不足时可能影响性能。
Parallel Scavenge + Serial Old(默认组合之一)
使用 Serial Old 收集器(JDK 8 中)。
执行标记 - 整理操作。
采用此组合。不过由于老年代单线程回收,在大内存和高并发场景下性能可能受限。
G1 收集器(自成体系,可看作全堆处理组合)
对整个堆进行管理。
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 能够有效处理这些对象,避免在老年代频
繁进行复制操作带来的性能开销。
本文整理自实践经验,如有问题欢迎交流讨论。