垃圾回收性能有吞吐量和占用空间两个主要度量标准。
吞吐量:吞吐量是长时间未在垃圾回收中花费的总时间的百分比。吞吐量包括在分配中花费的时间(但通常不需要调整分配速度)和应用程序由于发生垃圾回收而出现无响应的时间。
占用空间:占用空间是进程的工作集,以页面和缓存行为单位进行度量。在物理内存有限或进程较多的系统上,占用空间可能决定了可伸缩性。及时性是对象失效和内存变为可用之间的时间,是分布式系统(包括远程方法调用 (RMI))的一个重要考虑因素。
垃圾收集器类型
- 串行收集器
串行收集器使用单个线程来执行所有垃圾回收工作,这使得它相对高效,因为线程之间没有通信开销。它最适合单处理器机器,因为它不能利用多处理器硬件,尽管它在多处理器上可用于具有小型数据集(高达约100 MB)的应用程序。默认情况下,在某些硬件和操作系统配置上选择串行收集器,或者可以使用 选项 显式启用 。-XX:+UseSerialGC - 吞吐量收集器
并行执行次要收集,这可以显著减少垃圾回收开销。它适用于在多处理器或多线程硬件上运行的具有中型到大型数据集的应用程序。默认情况下,在某些硬件和操作系统配置上选择并行收集器,或者可以使用 选项 显式启用 并行收集器。-XX:+UseParallelGC
并行压缩是一项功能,它使并行收集器能够并行执行主要集合。如果没有并行压缩,则使用单个线程执行主要收集,这可能会显著限制可伸缩性。如果已指定该选项,则默认情况下启用并行压缩。将其关闭的选项是 。-XX:+UseParallelGC-XX:-UseParallelOldGC - 并发低暂停收集器
大多数并发收集器并发执行其大部分工作(例如,当应用程序仍在运行时),以保持垃圾回收暂停时间短。它专为具有中型到大型数据集的应用程序而设计,在这些应用程序中,响应时间比总体吞吐量更重要,因为用于最小化暂停的技术可能会降低应用程序性能。Java HotSpot VM提供了两个大多数并发收集器之间的选择;请参阅大多数并发收集器。使用该选项启用 CMS 收集器或启用 G1 收集器。-XX:+UseConcMarkSweepGC-XX:+UseG1GC
垃圾收集器应用场景推介
串行收集器
-
如果应用程序具有较小的数据集(最多约 100 MB),则选择带有 选项 的串行收集器。-XX:+UseSerialGC
-
如果应用程序将在单个处理器上运行,并且没有暂停时间要求,则让 VM 选择收集器,或使用选项 选择 串行收集器。-XX:+UseSerialGC
吞吐量收集器
-
如果 (a) 应用程序性能峰值是第一优先级,并且 (b) 没有暂停时间要求或 1 秒或更长时间的暂停是可以接受的,则让 VM 选择收集器,或选择并行收集器。-XX:+UseParallelGC
-
如果要使用大量处理器提高应用程序的性能,请使用吞吐量收集器。在串行收集器中,垃圾回收由一个线程完成,因此垃圾回收会增加应用程序的串行执行时间。吞吐量收集器使用多个线程来执行次要集合,从而减少应用程序的串行执行时间。典型情况是应用程序具有大量线程分配对象的情况。在这样的应用中,通常需要一大批年轻一代。
并发低暂停收集器
- 如果响应时间比总吞吐量更重要,并且垃圾回收暂停必须保持在大约 1 秒以内,请选择并发收集器,方法是 使用 或 。-XX:+UseConcMarkSweepGC-XX:+UseG1GC
- 如果您的应用程序将受益于较短的垃圾回收器暂停,并且能够在应用程序运行时与垃圾回收器共享处理器资源,请使用并发低暂停收集器。通常,具有相对较大的长期数据集(大型终身生成)并在具有两个或多个处理器的计算机上运行的应用程序往往会受益于此收集器的使用。但是,对于任何具有低暂停时间要求的应用程序,都应考虑使用此收集器。对于在单个处理器上具有适度大小的终身代数的交互式应用程序,已经观察到最佳结果。