【HotSpot虚拟机垃圾回收调优指南】2.Ergonomics

Ergonomics是Java虚拟机(JVM)和垃圾收集启发(如基于行为的启发)改进应用程序性能的过程。
           JVM为垃圾收集器、堆大小和运行时编译器提供了与平台相关的默认选择。这些选择匹配不同类型应用程序的需要,同时需要使用较少的命令行来进行调优。此外,基于行为的调优动态地优化堆的大小,以满足应用程序的特定行为。
           本节介绍这些默认选择和基于行为的调优。在使用后续章节中描述的更详细的控件之前,请使用这些默认值。

目录

一. 垃圾收集器,堆和运行时编译器默认选择

二.基于行为的调优

三.调整策略


一. 垃圾收集器,堆和运行时编译器默认选择

下面这些是重要的垃圾收集器、堆大小和运行时编译器默认选择:

  • 垃圾优先(G1)收集器.
  • 垃圾收集线程的最大数量受堆大小和可用CPU资源的限制.
  • 物理内存1/64的初始堆大小.
  • 物理内存1/4的最大堆大小.
  • 分层编译器,使用C1和C2.

二.基于行为的调优

可以将Java HotSpot VM垃圾收集器配置为优先满足以下两个目标之一:最大暂停时间和应用程序吞吐量。如果满足了首选目标,收集器将尝试最大化其他目标。当然,这些目标并不总是能够实现:应用程序需要一个最小的堆来容纳(至少)所有活动数据,而其他配置可能会阻止达到某些或所有期望的目标。

1.最大暂停时间目标

       暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的目的是限制最长的暂停时间。
                  暂停的平均时间和该平均时间上的方差由垃圾收集器维护。平均值是从执行开始时开始计算的,但它经过了加权,因此最近的暂停次数更重要。如果平均值加上暂停时间的方差大于最大暂停时间目标,则垃圾收集器认为该目标没有得到满足。
                  使用命令行选项-XX:MaxGCPauseMillis = <nnn>指定最大暂停时间目标。 这被解释为给垃圾收集器的提示,希望暂停时间为<nnn>毫秒或者更少。 垃圾收集器调整Java堆大小以及与垃圾收集相关的其他参数,以尝试使垃圾收集暂停时间小于<nnn>毫秒。 最大暂停时间目标的默认值因收集器而异。这些调整可能会导致垃圾收集更加频繁,从而降低应用程序的总体吞吐量。然而,在某些情况下,期望的暂停时间目标往往得不到无法实现。

2.吞吐量目标

          吞吐量目标是根据收集垃圾花费的时间来度量的,而在垃圾收集之外花费的时间是应用程序时间。
                     目标由命令行选项-XX:GCTimeRatio = nnn指定。 垃圾收集时间与应用时间的比率为1 /(1 + nnn) 例如,-XX:GCTimeRatio = 19设置目标为垃圾收集总时间的1/20或5%。
                     在垃圾收集中花费的时间是所有垃圾收集引起的暂停的总时间。如果吞吐量目标没有得到满足,那么垃圾收集器可能采取的一个行动是增加堆的大小,以便在收集暂停期间在应用程序中花费的时间可以更长。

三.调整策略

堆大小增大或缩小到支持所选吞吐量目标的大小。 了解堆调整策略,例如选择最大堆大小以及选择最大暂停时间目标。

除非您知道需要大于默认最大堆大小的堆大小,否则不要为堆选择最大值。选择一个足以满足您的应用程序的吞吐量目标。

应用程序行为的更改可能导致堆增长或收缩。例如,如果应用程序开始以更高的速率分配,那么堆就会增长以保持相同的吞吐量。

如果堆增长到最大大小,而吞吐量目标没有得到满足,那么对于吞吐量目标来说,最大堆大小太小。将最大堆大小设置为接近平台上的总物理内存的值,但不要导致应用程序的交换。再次执行应用程序。如果吞吐量目标仍然没有达到,那么应用程序时间的目标对于平台上的可用内存来说太高了。

如果吞吐量目标可以满足,但是暂停时间太长,那么选择一个最大暂停时间目标。选择最大暂停时间目标可能意味着您的吞吐量目标无法实现,因此请选择对应用程序来说是可接受的折衷值。

垃圾收集器试图满足竞争目标时,堆的大小通常会发生波动。即使应用程序已经达到稳定状态,也是如此。实现吞吐量目标(可能需要更大的堆)的压力与实现最大暂停时间和最小占用空间(两者都可能需要小堆)的目标相竞争。

猜你喜欢

转载自blog.csdn.net/weixin_37519752/article/details/89351913
今日推荐