https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html
java虚拟机包含三种不同类型的垃圾收集器,每种垃圾收集器都有不同的性能特点。
-
串行垃圾收集器
串行垃圾收集器使用单线程进行垃圾收集工作,这种方式决定了串行垃圾收集器的高效性,因为他不需要线程间的交互工作。这种垃圾收集器最适用于单处理器的环境,因为他无法利用多处理器硬件。同时,串行处理器在小数据集(约100m)的应用程序而言也是适用的。 默认情况下,在某些硬件和操作系统配置上选择串行收集器,或者可以使用选项-XX:+ UseSerialGC显式启用串行收集器。 -
并行垃圾收集器
并行垃圾收集器,也被称作吞吐量优先垃圾收集器,主要用在minor gc时的垃圾收集,她可以显著减少垃圾收集的开销。并行垃圾收器适用于中等到大型数据量的,在多处理器环境上运行的应用程序。默认情况下,在某些硬件和操作系统配置上选择并行收集器,或者可以使用选项-XX:+ UseParallelGC显式启用并行收集器。- 并行压缩收集器Parallel compaction
并行压缩收集器使得major gc可以并行进行。如果没有并行压缩收集器, major gc就只能使用单线程来执行,这样会限制major gc的可伸缩性。如果已指定选项-XX:+ UseParallelGC,则默认启用并行压缩。关闭它的选项是-XX:-UseParallelOldGC。
- 并行压缩收集器Parallel compaction
-
大多数的并发垃圾收集器,可以并发执行垃圾收集工作(例如,在应用程序仍在运行时)以防止垃圾收集导致应用程序的暂停。它适用于中型到大型数据量的,响应时间比总吞吐量重要的应用程序,因为降低垃圾收集的暂停时间会导致应用程序的性能下降。 Java HotSpot VM提供了两种并发垃圾收集器;这两种垃圾收集器可参见章节The Mostly Concurrent Collectors的介绍。使用选项-XX:+ UseConcMarkSweepGC启用CMS收集器或-XX:+ UseG1GC启用G1收集器。
选择垃圾收集
除非你的应用程序严格要求限制垃圾收集导致的程序暂停时间,可以采用首先运行你的应用程序,允许虚拟机默认选择垃圾收集器的方法。如果实际需要,可以调整堆大小,来提升性能。如果性能仍然无法达到你的标准,可以采用以下的指南来自行选择垃圾收集器。
- 如果应用程序的数据量较小(上限约100m)可以采用命令行 -XX:+UseSerialGC,选择串行垃圾收集器
- 如果应用程序运行在单处理器的环境上,且对垃圾收集暂停时间无要求,可以则让VM选择收集器,或使用命令-XX:+ UseSerialGC 选择串行收集器。
- 如果(a)峰值应用程序性能是第一优先级并且(b)没有暂停时间要求或1秒或更长的暂停是可接受的,那么让VM选择收集器,或使用命令 -XX,选择并行收集器:+ UseParallelGC 。
- 如果响应时间比总吞吐量更重要,并且垃圾收集暂停必须保持短于大约1秒,则选择并发垃圾收集器:+ UseConcMarkSweepGC或-XX:+ UseG1GC。
以上的指南只提供一些调整垃圾收集器性能的起步意见,因为垃圾收集的性能与很多因素有关:堆大小,存活对象的数据量,处理器的个数以及处理速度。暂停时间对这些因素尤其敏感,所以 前面提到的1秒阈值只是近似值:并行收集器在许多数据大小和硬件组合上将经历超过1秒的暂停时间; 相对的,并发垃圾收集器,在某些条件组合下,可能无法保持小于1s的垃圾收集暂停时间。
如果推荐的收集器未达到所需性能,请首先尝试调整堆和分代的大小,以满足性能目标。 如果性能仍然不足,那么可以尝试使用不同的垃圾收集器:使用并发收集器来减少暂停时间,并使用并行收集器来提高多处理器硬件的总吞吐量。