JDK8垃圾回收调优指南--(2)人机工程

原文:Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide--Ergonomics

人机工程学是通过Java虚拟机(JVM)和垃圾收集调优(如基于行为的调优)提高应用程序性能的过程。

  1. JVM为垃圾收集器、堆大小和运行时编译器提供了与平台相关的默认选择。这些选择匹配不同类型应用程序的需要,同时需要较少的命令行调优。
  2. 此外,基于行为的调优动态地调整堆的大小,以满足应用程序的特定行为。

此部分描述这些默认选择和基于行为的调优。在使用后面几节中描述的更详细的操控之前,先使用这些默认值。

垃圾收集器, 堆, 运行时编译器的默认选项(JVM提供,平台相关)

被称为服务器的一类机器:

  • 至少2个物理处理器
  • 至少2GB的物理内存

在服务器上,默认的选项是:

  • 并行垃圾收集器(吞吐量收集器)
  • 堆内存的初始大小为物理内存的1/64,最大1GB
  • 最大的堆内存大小为物理内存的1/4,最大1GB
  • 服务器运行时编译器

对于64位系统的初始及最大的堆大小,参见“并行收集器”中的默认堆大小

服务器类机器的定义适用于所有平台,但运行Windows操作系统版本的32位平台除外。表2-1,“默认运行时编译器”展示了不同平台的选择:

Default Runtime Compiler

脚注1:Client表示客户端运行时编译器,Server表示服务端运行时编译器。

脚注2:即使在服务器类机器上,也选择该策略来使用客户机运行时编译器。之所以做出这样的选择,是因为历史上客户机应用程序(例如,交互应用程序)在这种平台和操作系统的组合上运行得更频繁。

脚注3:只支持服务器运行时编译器。

基于行为调优

对于并行收集器,Java SE为了实现应用程序指定行为提供了两个垃圾收集调优参数:最大暂停时间目标和应用程序吞吐量目标;参见并行垃圾收集器。应用程序需要一个足够大的堆,至少可以容纳所有存活的数据。此外,最小堆大小可能会妨碍达到这些期望的目标。

Maximum Pause Time Goal

暂停时间(GC停顿)是指垃圾收集器(回收时)停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标主要是为了限制停顿时间不要太长。暂停的平均时间和该平均时间上的方差由垃圾收集器维护。平均值是从执行开始时开始计算的,但是要进行加权,最近的暂停次数更重要。如果平均值加上暂停时间的方差大于最大暂停时间目标,则垃圾收集器认为目标没有达到。

最大暂停时间目标通过命令行'-XX:MaxGCPauseMillis=<nnn>'配置。这被解释为给垃圾收集器的一个提示,即需要<nnn>毫秒或更少的暂停时间。垃圾收集器将调整Java堆大小和其它与垃圾收集相关的参数,以使垃圾收集暂停时间小于<nnn>毫秒。默认情况下,没有最大暂停时间目标。这些调整可能会导致垃圾收集器更频繁地发生,从而降低应用程序的总体吞吐量。垃圾收集器尝试在吞吐量目标之前满足任何暂停时间目标(优先级:最大暂停时间>总体吞吐量)。然而,在某些情况下,期望的暂停时间目标无法实现。

Throughput Goal

吞吐量目标是根据垃圾回收的时间和垃圾回收之外的时间(称为应用程序时间)来度量的。这个目标通过命令行'-XX:GCTimeRatio=<nnn>'配置。垃圾收集时间与总时间(GC时间+应用程序时间)之比为1/(1 + <nnn>)(此处注意,原文:“The ratio of garbage collection time to application time is 1/(1+<nnn>)”中为GC时间与应用时间之比为1/(1+<nnn>))。例如,'-XX:GCTimeRatio=19'将总时间的1/20或5%设置为垃圾收集的目标。

花费在垃圾收集上的时间是年轻代和老年代收集时间之和。如果吞吐量的目标没有达到,则增加代(年轻代、老年代)的大小来企图增加应用在多次回收之间的运行时间(连续2次回收的间隔)。

Footprint Goal

如果最大暂停时间和吞吐量目标已经满足,那么垃圾收集器将减少堆的大小,直到其中一个目标(始终是吞吐量目标)无法满足为止。没有达到的目标将被处理。

调节策略

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

堆将增长或收缩到支持所选吞吐量目标的大小。应用程序行为的更改可能导致堆增长或收缩。例如,如果应用程序开始以更高的速度分配,堆将会增长以保持相同的吞吐量(如果不相应增加堆的大小,会导致GC更加频繁,吞吐量下降)。

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

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

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

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