【HotSpot虚拟机垃圾回收调优指南】5.可选的收集器以及选择指南

到目前为止的讨论都是关于串行收集器(serial collector)的。Java HotSpot VM包含了三种不同类型的收集器,每种收集器分别具有不同的性能特征。

目录

一.串行收集器(Serial Collector)

二.并行收集器(Parallel Collector)

三.主要并发收集器(The Mostly Concurrent Collectors)

1.G1垃圾收集器(G1 garbage collector)

2.并发标记清除收集器(CMS collector)

四. Z垃圾收集器(The Z Garbage Collector)

五.选择收集器


一.串行收集器(Serial Collector)

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

它最适合单处理器机器,因为它不能利用多处理器硬件,尽管对于在多处理器机器上具有小数据集(大约100 MB)的应用程序,它非常有用。在某些硬件和操作系统配置上是系统默认的垃圾收集器是串行收集器(Serial Collector),或者你可以使用配置-XX:+UseSerialGC选项显式启用。

二.并行收集器(Parallel Collector)

并行收集器(Parallel Collector)也称为吞吐量收集器(throughput collector),它是与串行收集器(Serial Collector)类似的分代收集器。串行收集器(Serial Collector)和并行收集器(Parallel Collector)之间的主要区别是,并行收集器有多个线程,用于加速垃圾收集。

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

并行压缩(Parallel compaction)是使并行收集器能够并行执行major收集的要特性。如果没有并行压缩,则使用单个线程执行major收集(major collections:指发生在老年代的GC),这将极大地限制可伸缩性。如果指定了-XX:+UseParallelGC,则默认启用并行压缩。还可以使用-XX:-UseParallelOldGC禁用它。

三.主要并发收集器(The Mostly Concurrent Collectors)

并发标记清除(CMS:Concurrent Mark Sweep)收集器和垃圾优先(G1)垃圾收集器是两种主要的并发收集器。The Mostly Concurrent Collectors为应用程序并发地执行一些昂贵(高消耗)的工作。

1.G1垃圾收集器(G1 garbage collector)

这种服务器风格的收集器适用于大内存的多处理器计算机。 它以高概率满足垃圾收集暂停时间目标同时,实现高吞吐量。

在某些硬件和操作系统配置上是系统默认的垃圾收集器是G1,或者你可以使用配置-XX:+UseG1GC选项显式启用。

2.并发标记清除收集器(CMS collector)

此收集器适用于那些追求更短的垃圾收集暂停时间并能够与垃圾收集共享处理器资源的应用程序。启用CMS收集器(CMS collector)参数:-XX:+UseConcMarkSweepGC

四. Z垃圾收集器(The Z Garbage Collector)

Z垃圾收集器(ZGC)是一种可伸缩的低延迟的垃圾收集器。ZGC可以同时执行所有开销较大的工作,而不停止应用程序线程的执行。

 ZGC适用于需要低延迟(少于10毫秒暂停)和/或使用非常大堆(multi-terabytes:多兆字节)的应用程序。你可以通过配置参数: -XX:+UseZGC 来启用它

从JDK 11开始,ZGC作为实验性功能提供。

五.选择收集器(Selecting a Collector)

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

如果有必要,可以调整堆大小以提高性能。如果性能仍然没有达到你的预期的目标,那么可以使用以下指南作为选择收集器的起点:

1.如果应用程序有一个小的数据集(大约100 MB),那么使用-XX:+UseSerialGC选择串行收集器(Serial Collector)。

2.如果应用程序将在单个处理器上运行,并且没有暂停时间要求,那么使用-XX:+UseSerialGC选择串行收集器(Serial Collector)。

3. 如果(a)应用程序性能峰值是第一优先级,并且(b)没有暂停时间要求,或可以接受一秒或更长的暂停,那么让虚拟机选择收集器或使用-XX:+UseParallelGC选择并行收集器(Parallel Collector)。

4.如果响应时间比总吞吐量更重要,并且垃圾收集暂停必须保持在大约1秒以内,那么选择一个主要并发收集器(The Mostly Concurrent Collectors),配置参数:-XX:+UseG1GC-XX:+UseConcMarkSweepGC

5.如果响应时间是高优先级,并且/或者你应用发程序使用的堆非常大,那么可以使用参数-XX:UseZGC选择一个完全并发的收集器(fully concurrent collector)。

以上这几条只提供了选择收集器的一个起点(思路),因为性能取决于堆的大小、应用程序维护的活动数据量以及可用处理器的数量和速度。

如果推荐的收集器没有达到预期的性能,那么首先尝试调整堆和"分代(generation )"的大小,以满足预期的目标。如果性能仍然不够好,那么尝试使用另外一种收集器:使用并发收集器(the concurrent collector)来减少暂停时间,并使用并行收集器( parallel collector )来增加多处理器硬件上的总体吞吐量。

猜你喜欢

转载自blog.csdn.net/weixin_37519752/article/details/89445650