JDK8垃圾回收调优指南--(5)可用垃圾收集器

原文:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide--Available Collectors。

截止目前讨论的都是关于串行收集器的。Java HotSpot VM包含三种不同类型的收集器,每种收集器具有不同的性能特征。

  • 串行收集器,使用一个线程执行所有垃圾收集工作,这使得它相对高效,因为没有线程之间的通信开销。它最适合于单处理器机器,因为它不能利用多处理器硬件,尽管它对运行在多处理器上的小数据集(约100 MB)的应用程序很有用(非最佳)。串行收集器在某些硬件和操作系统配置上是默认选择的,或者可以通过选项'-XX:+UseSerialGC'显式启用。
  • 并行收集器(也称为吞吐量收集器),并行执行'minor collection',这可以显著减少垃圾收集开销。它适用于运行在多处理器或多线程硬件上,具有中型到大型数据集的应用程序。在某些硬件和操作系统配置上默认选择并行收集器,或者可以使用命令行'-XX:+UseParallelGC'显式启用它。

“并行压缩”是并行收集器并行地执行'major collection'时的特性。如果没有并行压缩,则使用单个线程执行'major collection',这将极大地限制可伸缩性。 如果指定了'-XX:+UseParallelGC'选项,则默认启用并行压缩。关闭它的选项是'-XX:-UseParallelOldGC'。

  • 大多数并发收集器,并发地执行大部分工作(例如,当应用程序仍在运行时),以保持GC停顿时间较短。它是为具有中型到大型数据集的应用程序设计的,其响应时间比总体吞吐量更重要,因为最小化暂停(回收频率增加)会降低应用程序性能。JVM提供了2种并发收集器,参见并发收集器。使用选项'-XX:+UseConcMarkSweepGC'启用CMS收集器,或者'-XX:+UseG1GC'启用G1收集器。

Selecting a Collector

除非您的应用程序有相当严格的GC停顿要求,否则首先运行您的应用程序,并允许VM选择收集器。如果需要,调整堆大小以提高性能。如果性能仍然没有达到您的目标,那么可以使用以下指南作为选择收集器的起点。

  • 如果应用程序有一个小的数据集(大约100 MB),那么使用'-XX:+UseSerialGC'选项选择串行收集器。
  • 如果应用程序将在单个处理器上运行,并且对GC停顿没有要求,那么让VM(自动地)选择收集器,或者使用'-XX:+UseSerialGC'选项选择串行收集器。
  • 如果满足2点:(a)应用程序性能的峰值是第一优先级,并且(b)对GC停顿无要求,暂停1秒或更长都是可以接受的,
    那么让VM选择收集器,或者使用'-XX:+UseParallelGC'选择并行收集器。
  • 如果响应时间比总体吞吐量更重要,并且GC停顿时间必须保持在大约1秒以内,那么使用'-XX:+UseConcMarkSweepGC'或'-XX:+UseG1GC'选择并发收集器。

这些指南只提供了选择收集器的一个起点,因为性能取决于①堆的大小、②应用程序维护的存活对象量以及③可用处理器的数量和速度。停顿时间对这些因素特别敏感,所以前面提到的1秒的阈值只是一个近似值:并行收集器在许多不同的数据集大小和硬件的组合上的GC停顿时间将超过1秒;相反,对于某些组合,并发收集器也不一定将GC停顿时间保持在1秒以内。

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

 

你可能感兴趣的:(java虚拟机)