JVM笔记四——HotSpot虚拟机垃圾收集调整指南(JDK12官方文档翻译)

HotSpot虚拟机垃圾收集调整指南

垃圾收集调整简介(Introduction to Garbage Collection Tuning

         为了支持java应用的多样性,Java HotSpot VM提供了多个垃圾收集器,每个垃圾收集器都旨在满足不同的需求。JavaSEr根据运行应用程序的计算机类选择最适合的垃圾收集器。但是,这种选择对于每个应用程序可能都不是最佳的,具有严格性能目标或其他目的的用户,开发人员或者管理员可能需要明确选择垃圾收集器并调整某些参数以实现性能级别。本文档提供了有助于完成这些任务的信息。

         首先,垃圾收集器的一般特性和基本的调优选项将在“stop-the-world collector”系列的上下文中描述。然后介绍其他垃圾收集器的特点,以及选择垃圾收集器时应该考虑的因素。

1、什么是垃圾收集器

         垃圾收集器(GC)自动管理应用程序的动态内存分配请求。

垃圾收集器通过以下操作执行自动动态内存分配:

         1.从操作系统(OS)分配内存,并将分配的内存返回给操作系统;

         2.在应用程序请求内存时将应用程序返回分发给应用程序;

         3.明确应用程序仍在使用该内存的哪些部分;

         4.回收未使用的内存,供程序重新使用。

Java HotSpot垃圾收集器采用以下技术来提高这些操作的效率:

         1.将代际清除与周期老化结合使用,将目标集中在堆中最有可能包含大量内存可回收内存区域的区域。(Use generational scavenging in conjunction with aging to concentrate their efforts on areas in the heap that most likely contain a lot of reclaimable memory areas.

         2. 尽量多的使用多线程进行并发操作,或者在程序运行的同时,在后台执行一些运行时间比较长的操作(long-running-operations)(奉上原文,这段我用几个翻译软件翻译的都不准确Use multiple threads to aggressively make operations parallel, or perform some long-running operations in the background concurrent to the application.)。

         3.通过压缩对象,获取更多的连续内存空间。

为什么垃圾回收器的选择特别重要?

         垃圾收集器的目的是使软件开发人员免于手动地动态内存的管理,开发人员无需将分配与解除分配相匹配,并且可以密切关注分配的动态内存的生命周期。这完全消除了与内存管理相关的错误,而代价就是一些额外的运行时开销,Java HotSpot VM提供了一系列的垃圾回收算法供您选择。

         什么时候选择垃圾收集器更重要?对于某些应用程序,答案永远不会是。也就是说,在垃圾收集器暂停的频率和持续时间适中的情况下,应用程序可以很好的运行。但是对于大型的应用程序,尤其是那些具有大数据量(几十亿字节)、多线程和高事务率的应用程序,情况并非如此。

         阿姆达尔定律(Amdahl's law,给定问题的并行加速受到问题的连续部分的限制。)意味着大多数工作负载不能完美并行化,有些部分总是连续的,并没有从并行中受益。在Java平台中,目前有四种垃圾回收替代方案,出了其中一个,即“串联GC”,其他的都可以并行化工作,以提高性能。尽可能低地降低垃圾收集的开销是必要的,这可以在下面的事例中看出。

图1-1比较垃圾收集花费的时间百分比

         图1-1的图表完美的模拟了一个理想的系统,除了垃圾收集器之外,该系统具有完全的可扩展性。红线是在一个单处理器系统上只花了1%的时间进行垃圾处理的应用程序。这意味着在32位的系统上,其吞吐量损失超过了20%。洋红色的线表示,对于垃圾回收时间为10%的应用程序(单处理器应用程序中,垃圾收集时间不算太长),当扩展到32位时,系统将损失75%以上的吞吐量。

         该图显示,在小型系统上开发时,其可以忽略地吞吐量问题,在大型系统上却成为了瓶颈。然而,在减小这种瓶颈上的微小改进,可以在系统性能上得到显著的提高。对于足够大的系统,选择正确的垃圾收集器并在必要的时候对其进行优化是值得的。

         串行GC通常适用于大多数小型应用,尤其是那些在现代处理器上需要高达100M字节的堆的应用。其他GC有额外的开销或者复杂性,这是专业行为的代价。如果,应用程序不需要备用GC,请使用串行收集器。有一种情况串行收集器不可能是最佳选择,那就是一个运行在具有大内存和两个及以上的处理器的机器上的、大型的多线程应用程序。当应用程序在这种服务器类机器上运行时,默认情况下会选择G1垃圾回收器。

文档中支持的操作系统

         本文档及其建议适用于所有JDK 12支持的系统配置,受特定配置中某些垃圾收集器的实际可用性限制。 请参阅Oracle JDK认证系统配置。

 

参考文档(JDK12官方文档)

https://docs.oracle.com/en/java/javase/12/gctuning/introduction-garbage-collection-tuning.html#GUID-223394DF-2E27-4F5D-A7DF-83151EB577BB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章