CodeGym/Java 课程/模块 3/Java中垃圾收集器的类型

Java中垃圾收集器的类型

可用

串行GC

垃圾收集通过从堆中删除未引用的对象并为新创建的对象腾出空间来提高 Java 中的内存效率。

Java 虚拟机有八种类型的垃圾收集器。让我们详细考虑它们中的每一个。

Serial GC是最简单的 GC 实现。它适用于在单线程环境中运行的小型应用程序。所有垃圾收集事件都在同一线程上按顺序执行。压缩在每次垃圾收集后执行。

串行GC

运行收集器会导致“world stop”事件,此时整个应用程序都会暂停。由于整个应用程序在垃圾收集期间被冻结,如果您想尽可能降低延迟,您不应该在现实生活中求助于此。

使用串行垃圾收集器的 JVM 参数是 -XX:+UseSerialGC

并行GC

并行垃圾收集器专为在多线程或多处理器硬件上运行的具有大中型数据集的应用程序而设计。这是默认的 GC 实现,也称为吞吐量收集器。

几个线程注定要在年轻一代中进行小型垃圾回收。唯一的线程忙于老年代的主要垃圾回收。

并行GC

运行并行 GC 还会导致世界“停止”并且应用程序挂起。此行为更适合需要完成许多任务并且可以接受长时间暂停的多线程环境,例如运行批处理作业时。

使用并行垃圾收集器的 JVM 参数是-XX:+UseParallelGC

气相色谱仪

我们也称为低位平行拾取器

在这里,对于小型垃圾收集,涉及多个线程,这是通过与并行收集器中相同的算法发生的。主要的垃圾收集是多线程的,就像旧的并行 GC 一样,但 CMS 与应用程序进程并发运行以最大限度地减少“世界停止”事件。

气相色谱仪

因此,CMS 收集器比其他收集器消耗更多的 CPU。如果你有能力分配更多的 CPU 来提高性能,那么 CMS 比简单的并行收集器更可取。CMS GC 不会压缩。

使用并行标记清除垃圾收集器的 JVM 参数是-XX:+UseConcMarkSweepGC

G1(垃圾优先)GC

G1GC被认为是 CMS 的替代品,并且是为以大堆大小(大于 4 GB)为特征的多线程应用程序开发的。它像 CMS 一样并行且具有竞争力,但在幕后它的工作方式与旧的垃圾收集器截然不同。

尽管 G1 也是按代运行的,但它没有为年轻一代和老一代提供单独的空间。相反,每一代都是一组区域,允许灵活地改变年轻一代的大小。

G1 将堆分成一组大小相等的区域(取决于堆的大小)并将它们扫描到多个线程中。程序执行期间的区域可以反复变老和变新。

标记阶段完成后,G1 知道哪些区域包含最多的垃圾。如果用户对最小化停顿感兴趣,G1 只能选择几个区域。如果暂停时间对用户不重要,或者暂停时间限制设置的很高,G1 会遍历更多的区域。

由于G1 GC会识别垃圾最多的区域,并首先对这些区域进行垃圾回收,因此称为“垃圾优先”。

G1GC中除了Eden、Survivors和Old Memory区域之外,还有另外两种类型。

  • Humongous (Huge) - 适用于大尺寸对象(超过堆大小的 50%)。
  • 可用- 未使用或未分配的空间。

使用 G1 垃圾收集器的 JVM 参数是-XX:+UseG1GC

谢南多亚(Shandara)

Shenandoah是作为 JDK 12 的一部分发布的新 GC。与 G1 相比,Shenandoah 的主要优势在于大部分垃圾收集周期是与应用程序线程并发完成的。G1 只能在应用挂起时清空堆区,而 Shenandoah 则与应用同时移动对象。

Shenandoah 几乎可以在找到空闲内存后立即压缩活动对象、清理垃圾和释放 RAM。由于所有这些都是同时发生的,没有暂停应用程序,Shenandoah 的 CPU 密集度更高。

Shenandoah 垃圾收集器的 JVM 参数: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

中关村

ZGC是作为 JDK 11 的一部分发布并在 JDK 12 中改进的另一种 GC。

它适用于需要速度和低延迟(暂停少于 10 毫秒)和/或使用非常大的堆(几 TB)的应用程序。

ZGC 的主要目标是低延迟、可扩展性和易用性。为此,它允许 Java 应用程序继续运行,尽管垃圾收集操作正在进行中。默认情况下,ZGC 释放未使用的内存并将其返回给操作系统。

因此,ZGC 通过提供极短的停滞时间(通常在 2 毫秒以内),比其他传统 GC 带来了显着改进。

ZGC的主要目标 

使用 ZGC 垃圾收集器的 JVM 参数是 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论