个人博客地址:JVM可用的垃圾回收器 | 一张假钞的真实世界
垃圾收集器分类
Java HotSpot VM有三种不同类型的收集器,每种收集器具有不同的性能特征。
- 串行收集器使用单个线程来执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。它最适合单处理器机器,因为它不能利用多处理器硬件,尽管它对于具有小数据集(最多约100MB)的应用程序在多处理器上很有用。在某些硬件和操作系统配置上默认选择串行收集器,或者可以使用选项显式启用-XX:+UseSerialGC。
- 并行收集器(也称为吞吐量收集器)并行执行次要收集,这可以显著减少垃圾收集开销。它适用于在多处理器或多线程硬件上运行的具有中型到大型数据集的应用程序。并行收集器在某些硬件和操作系统配置上默认选择,或者可以使用选项显式启用-XX:+UseParallelGC。并行压缩是一个特性,它使并行收集器能够并行执行主要收集。如果没有并行压缩,主要收集是使用单个线程执行的,这会显着限制可伸缩性。如果-XX:+UseParallelGC已指定该选项,则默认情况下启用并行压缩。关闭它的选项是-XX:-UseParallelOldGC。
- 大多数并发收集器并发地执行其大部分工作(例如,当应用程序仍在运行时)以保持垃圾收集暂停较短。它专为具有中型到大型数据集的应用程序而设计,其中响应时间比总吞吐量更重要,因为用于最小化暂停的技术会降低应用程序性能。Java HotSpot VM提供了两个主要并发收集器之间的选择;请参阅主要的并发收集器。使用该选项-XX:+UseConcMarkSweepGC启用CMS收集器或-XX:+UseG1GC启用G1收集器。
选择垃圾收集器
除非您的应用程序对暂停时间有相当严格的要求,否则首先运行您的应用程序并允许VM选择垃圾收集器。如有必要,调整堆大小以提高性能。如果性能仍不能满足您的目标,请使用以下指南作为选择收集器的起点。
- 如果应用程序的数据集很小(最多大约100MB),则使用-XX:+UseSerialGC选项选择串行收集器。
- 如果应用程序将在单个处理器上运行并且没有暂停时间要求,那么让VM选择收集器,或者使用-XX:+UseSerialGC选项选择串行收集器。
- 如果同时满足以下两点,那么让VM选择收集器,或者使用-XX:+UseParallelGC选项选择并行收集器。
- 使应用程序达到最高的性能是第一优先级
- 没有暂停时间要求或1秒及更长的暂停是可以接受的
- 如果响应时间比总吞吐量更重要并且垃圾收集暂停必须保持短于大约1秒,则使用-XX:+UseConcMarkSweepGC或-XX:+UseG1GC选项选择并发收集器。
这些指南仅提供了选择收集器的起点,因为性能取决于堆的大小、应用程序维护的实时数据量以及可用处理器的数量和速度。暂停时间对这些因素特别敏感,因此前面提到的1秒阈值只是一个近似值:并行收集器在很多数据大小和硬件组合上会遇到超过1秒的暂停时间;相反,并发收集器可能无法在某些硬件组合上保持短于1秒的暂停。
如果推荐的收集器没有达到所需的性能,首先尝试调整堆和代大小以满足所需的目标。如果性能仍然不足,则尝试不同的收集器:使用并发收集器减少暂停时间并使用并行收集器增加多处理器硬件上的总体吞吐量。