欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

常用垃圾收集器简介

最编程 2024-05-02 06:58:15
...

到目前为止讨论的是串行收集器。Java HotSpot虚拟机包括三种不同类型的收集器,每种都具有不同的性能特征。

串行收集器

串行收集器使用单个线程执行所有垃圾回收工作,这使得它相对高效,因为线程之间没有通信开销。

它最适用于单处理器的机器,因为它无法利用多处理器硬件的优势,尽管它在具有小数据集(最大约100 MB)的多处理器应用程序上也可能有用。串行收集器在某些硬件和操作系统配置上默认选中,或者可以通过选项-XX:+UseSerialGC显式启用。

并行收集器

并行收集器也被称为吞吐量收集器,它是一个类似于串行收集器的分代收集器。串行和并行收集器之间的主要区别在于并行收集器具有多个线程,用于加速垃圾回收过程。

并行收集器适用于在多处理器或多线程硬件上运行的具有中等到大型数据集的应用程序。您可以通过使用-XX:+UseParallelGC选项来启用它。

并发收集器

垃圾优先的G1收集器

G1是一种主要是并发的收集器。大部分的并发收集器会在应用程序运行时同时执行一些昂贵的工作。这个收集器的设计目标是,能够在小型机器到拥有大量内存的大型多处理器机器上进行优化。它提供了满足暂停时间目标的能力,同时也能实现高吞吐量。

在大多数硬件和操作系统配置中,默认情况下会选择G1,或者您也可以通过使用-XX:+UseG1GC选项来显式启用它。

ZGC

ZGC提供的最大暂停时间可以降低到毫秒级,但会增加一些吞吐量的成本。它适用于需要低延迟的应用程序。暂停时间与正在使用的堆大小无关。ZGC适用于从几百兆字节到16TB的堆大小。要启用ZGC,请使用-XX:+UseZGC -XX:+ZGenerational选项。

-XX:+ZGenerational选项启用了 ZGC 的新版本,即分代版的 ZGC。若要退回到先前的非分代版 ZGC,请只使用-XX:+UseZGC选项,或者通过-XX:-ZGenerational选项明确禁用分代版本。

如何选择

除非您的应用具有相当严格的暂停时间要求,首先运行应用程序并允许虚拟机选择收集器。

必要时,调整堆大小以提高性能。如果性能仍无法达到目标,则可以使用以下指南作为选择收集器的起点:

  • 1.如果应用程序数据集较小(最大约100 MB),则选择串行收集器,使用选项-XX:+UseSerialGC。
  • 2.如果应用程序将在单处理器上运行且无暂停时间要求,则选择串行收集器,使用选项-XX:+UseSerialGC。
  • 3.如果(a)最优应用程序性能是首要考虑因素,并且(b)无暂停时间要求或接受可达一秒或更长的暂停,则让虚拟机选择收集器,或者选择并行收集器,使用-XX:+UseParallelGC选项。
  • 4.如果响应时间比总吞吐量更重要,并且需要保持垃圾回收暂停时间较短,则选择主要是并发的收集器,使用-XX:+UseG1GC选项。
  • 5.如果响应时间是首要考虑因素,则选择全并发的收集器,使用-XX:+UseZGC -XX:+ZGenerational选项。