5-当前可用的5个垃圾收集器
5.1 串行收集器
串行收集器使用单个线程来执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。
它最适合单处理器机器,因为它不能利用多处理器硬件,尽管它可以在多处理器上用于具有小数据集(最多大约 100 MB)的应用程序。在某些硬件和操作系统配置上默认选择串行收集器,或者可以使用选项显式启用 -XX:+UseSerialGC。
5.2 并行收集器
并行收集器也称为吞吐量收集器,它是类似于串行收集器的分代收集器。串行收集器和并行收集器之间的主要区别在于并行收集器有多个线程用于加速垃圾收集。
并行收集器适用于在多处理器或多线程硬件上运行的中型到大型数据集的应用程序。您可以使用该**-XX:+UseParallelGC**选项启用它。
并行压缩是一项使并行收集器能够并行执行主要收集的功能。如果没有并行压缩,主要收集使用单个线程执行,这会显着限制可伸缩性。-XX:+UseParallelGC如果已指定选项,则默认启用并行压缩。您可以使用该 -XX:-UseParallelOldGC 选项禁用它。
5.3 并发收集器
并发标记扫描 (CMS) 收集器和垃圾优先 (G1) 垃圾收集器是两个主要并发的收集器。大多数并发收集器同时对应用程序执行一些昂贵的工作。
G1 垃圾收集器:这种服务器式收集器适用于具有大量内存的多处理器机器。它以高概率满足垃圾收集暂停时间目标,同时实现高吞吐量。
在某些硬件和操作系统配置上默认选择 G1,或者可以使用**-XX:+UseG1GC**.
CMS 收集器:此收集器适用于喜欢较短的垃圾收集暂停并且能够与垃圾收集共享处理器资源的应用程序。
使用该选项**-XX:+UseConcMarkSweepGC**启用 CMS 收集器
自 JDK 9 起,CMS 收集器已被弃用。
5.4 Z 垃圾收集器
Z 垃圾收集器 (ZGC) 是一种可扩展的低延迟垃圾收集器。ZGC 并发执行所有昂贵的工作,而不会停止应用程序线程的执行。
ZGC 适用于需要低延迟(小于 10 毫秒的暂停)和/或使用非常大的堆(数 TB)的应用程序。您可以使用该**-XX:+UseZGC**选项启用。
从 JDK 11 开始,ZGC 可作为实验性功能使用。
5.5 如何选择收集器
除非您的应用程序有相当严格的暂停时间要求,否则首先运行您的应用程序并允许 VM 选择收集器。
如有必要,调整堆大小以提高性能。如果性能仍未达到您的目标,则使用以下准则作为选择收集器的参考:
-
如果应用程序有一个小数据集(最多大约 100 MB),则选择带有配置的串行收集器-XX:+UseSerialGC。
-
如果应用程序将在单个处理器上运行并且没有暂停时间要求,则选择带有选项的串行收集器-XX:+UseSerialGC。
-
如果 (a) 峰值是应用程序性能是第一优先级 并且 (b) 没有暂停时间要求或一秒或更长的暂停是可以接受的,那么让 VM 选择收集器或选择并行收集器-XX:+UseParallelGC。
-
如果响应时间比整体吞吐量更重要,并且垃圾收集暂停必须保持在大约一秒以内,那么选择一个大多数并发的收集器,使用-XX:+UseG1GC或-XX:+UseConcMarkSweepGC。
-
如果响应时间是一个高优先级,并且/或者您正在使用一个非常大的堆,那么选择一个完全并发的收集器-XX:UseZGC。
这些指南仅提供了选择收集器的选择的参考,因为性能取决于堆的大小、应用程序维护的实时数据量以及可用处理器的数量和速度。
如果推荐的收集器没有达到预期的性能,那么首先尝试调整堆和生成大小以满足预期的目标。如果性能仍然不足,请尝试不同的收集器:使用并发收集器来减少暂停时间,并使用并行收集器来增加多处理器硬件的整体吞吐量。
技术咨询与支持,可以扫描微信公众号进行回复咨询