本文档针对JDK8 HotSpot虚拟机,纯人工翻译,在力求准确表达官方文档原义的基础之上,会适当意译,不至于让译文显得太晦涩难懂。
Ergonomics [ˌɜːrɡəˈnɑːmɪks] :人机工程学,在这里可以理解为自适应调优。
Ergonomics 是JVM和GC调优(例如基于行为的调优)提高应用程序性能的过程。
- JVM为垃圾收集器、堆大小和运行时编译器提供了依赖于平台的默认选项。这些选项符合不同类型应用程序的需求,同时需要较少的命令行调优。
- 此外,基于行为的调整会动态调整堆的大小,以满足应用程序的特定行为。
本节描述了这些默认选择和基于行为的调优。
2.1 垃圾收集器,堆和运行时编译器的默认选项
被称为服务器的机器定义如下(Windows_32位除外):
- 2个或以上物理处理器
- 2GB或以上物理内存
服务器的默认选项:
- 吞吐量垃圾收集器
- 初始堆大小为物理内存的 1 64 \frac{1}{64} 641,最大为1 GB
- 最大堆大小为物理内存的 1 4 \frac{1}{4} 41,最大为1 GB
- 服务端运行时编译器
64位系统的初始堆大小和最大堆大小 参考并行收集器的默认堆大小
默认运行时编译器:
平台 | 操作系统 | 默认1 | 服务器默认1 |
---|---|---|---|
i586 | Linux | Client | Server |
i586 | Windows | Client | Client2 |
SPARC(64-bit) | Solaris | Server | Server3 |
AMD(64-bit) | Linux | Server | Server3 |
AMD(64-bit) | Windows | Server | Server3 |
2.2 基于行为的调优
对于并行收集器,Java SE为了实现应用程序的特定行为提供了两个垃圾收集调优参数:
- 最大暂停时间目标
- 应用程序吞吐量目标;
查看并行收集器。(这两个选项在其他收集器中不可用。)请注意,这些行为不能总是得到满足。
应用程序需要足够大的堆,以至少容纳所有的存活数据。此外,最小堆大小可能会阻止达到这些期望的目标。
2.2.1 最大暂停时间目标(Maximum Pause Time Goal)
暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的目的是限制这些暂停中的最长时间。
垃圾回收器会维护平均停顿时间和该平均值的方差。平均值是从执行开始时获取的,但经过加权后,最近的暂停次数占比更重。如果平均时间加上暂停时间的方差大于最大暂停时间目标,则垃圾回收器认为目标没有达到。
-XX:MaxGCPauseMillis=<nnn>
指定最大暂停时间,默认关闭。这个命令被解释为对垃圾收集器的提示,要求暂停时间为<nnn>
毫秒或更短。垃圾收集器将调整Java堆大小以及与垃圾收集相关的其他参数,以使垃圾收集暂停时间短于<nnn>
毫秒。这些调整可能会导致垃圾回收器更频繁地发生,从而降低应用程序的整体吞吐量。垃圾收集器会尝试在吞吐量目标之前先满足任何暂停时间目标(优先级:最大暂停时间>总体吞吐量)。但是,在某些情况下,无法达到期望的暂停时间目标。
2.2.2 吞吐量目标(Throughput Goal)
吞吐量目标是根据收集垃圾所花费的时间和垃圾收集之外所花费的时间(称为应用时间)来衡量的。
-XX:GCTimeRatio=<nnn>
垃圾收集时间与总时间(GC时间+app时间)的比率为
1
1
+
<
n
n
n
>
\frac{1}{1 + <nnn>}
1+<nnn>1。例如,-XX:GCTimeRatio=19
将垃圾收集目标设置总时间的
1
20
=
5
%
\frac{1}{20} = 5\%
201=5%.
垃圾收集所花费的时间是年轻代和老年代收集的总时间。如果没有达到吞吐量目标,那么将增加各代的大小,以增加应用程序在回收间隙(between collections)运行的时间。
2.2.3 占用空间目标(Footprint Goal)
如果最大暂停时间和吞吐量目标已经满足,则垃圾收集器将减小堆的大小,直到无法满足其中一个目标(始终是吞吐量目标)。然后解决未实现的目标。
2.3 调优策略(Tuning Strategy)
除非知道需要大于默认最大堆容量的堆,否则不要为堆选择最大值。选择适合你的应用程序的吞吐量目标。
堆将增长或缩小到可以支持所选吞吐量目标的大小。应用程序行为的更改可能导致堆增大或缩小。例如,如果应用程序开始以更高的速率分配,堆将增长以保持相同的吞吐量。
如果堆增长到最大大小,并且无法满足吞吐量目标,则最大堆大小对于吞吐量目标而言太小。将最大堆大小设置为接近平台上总物理内存但不会导致应用程序内存交换(swapping)的值。再次执行该应用程序。如果仍然不能满足吞吐量目标,则对于平台上的可用内存而言,应用程序时间目标太高。
如果可以达到吞吐量目标,但暂停时间太长,则选择最大暂停时间目标。选择最大暂停时间目标可能意味着您的吞吐量目标将无法实现,因此请选择应用程序可接受的折衷值。
通常,随着垃圾收集器试图满足有竞争的目标,堆的大小会振荡。即使应用程序已达到稳定状态,也是如此。实现吞吐量目标(可能需要更大的堆)与获得最大暂停时间和最小占用空间(这两者都可能需要小的堆)的目标相竞争。