人体工效-自动选择和行为调整

说明

  • ==本文摘自【MemoryManagement-Whitepaper-1-150020.pdf】并转译,本文并不是完整的转译,部分地方有删减;==
  • ==本人水平有限,如有不正确的地方烦请指出,感激不尽。==

概述

在J2SE 5.0的发行版中,垃圾回收器、堆大小和HotSpot VM的模式都是JVM通过应用程序运行的平台和操作系统来自动选择的,这些自动选择可以更好的匹配不同类型的应用程序,这比前一版只需要少量的命令行选项即可。

另外,对于并行垃圾回收器的动态调整也添加了一些新的方式,通过这些,用户可以指定所需的动作,也可以设置垃圾回收器根据需要动态调整堆区域的大小,根据平台相关的默认选择和根据需求动态垃圾回收的行为统称为人体工效,人体工效的作用就是可以通过少量的命令行选项就可以让JVM提供最合适的性能。

回收器、堆大小和虚拟机的自动选择

server模式机器至少包含以下两个条件之一:
- 2颗以上处理器
- 2GB以上物理内存

server模式机器的定义可以应用在所有平台,除了32位平台的Windows操作之外。

如果一台机器不是server模式机器,那么它的JVM、垃圾回收器和堆大小的默认值如下:
- client模式的JVM
- 串行垃圾回收器
- 堆的初始大小为4MB
- 堆的最大值是64MB

在server模式的机器中,JVM模式一直是server,除非你明确指定-client命令行选项来设置。在server模式的机器运行肯定是server模式的JVM,垃圾回收器默认是并行回收器,其他默认值和串行回收器一样。

在server模式机器中运行使用并行垃圾回收器的JVM(client或server),堆大小的初始值和最大值的默认是:
- 堆的初始值是物理内存的1/64,上限是1GB,
- 堆的最大值是物理内存的1/4,上限是1GB,

另外,在非server模式的机器中也是可以使用相同的默认值(堆的初始值是4MB和堆的最大值是64MB)。默认值可以通过命令行选项来重写,相对应的选项在后面的章节中。

并行回收器的基准行为调整

在J2SE 5.0发行版中,并行垃圾回收器的调整添加了一个新的方法,这些可以基于应用程序的想要的动作来调整对应的垃圾回收,命令行选项通常用来设置想要的动作,比如想达到最大停顿时间和应用程序吞吐量之间的平衡。

最大停顿时间目标

最大停顿时间可以通过以下命令行选项来设置:

-XX:MaxGCPauseMillis=n

这就可以限制并行回收器的停顿时间在n毫秒之内,并行回收器会自动调整垃圾回收的其他相关参数来保持垃圾回收的停顿时间在n毫秒之内,这些调整会引起垃圾回收器减少应用程序的总体吞吐量,并且在某些情况下这想要的停顿时间可能还达不到。

最大停顿时间被分隔应用在每一代中,一般来说,如果目标没达到,那么就会缩小这些代以尝试达到这些目标,默认情况下是没有设置最大停顿时间。

吞吐量目标

吞吐量的目标是通过垃圾回收所消耗的时间和除垃圾回收外其他操作所消耗的时间(一般是指应用程序的时间)来计算的,这个目标可以通过命令选项来设置:

-XX:GCTimeRatio=n

那么垃圾回收时间和应用程序时间就等于

1/(1+n)

例如,’-XX:GCTimeRatio=19’,那么垃圾回收的时间就是总时间的5%,这个选项的默认值是1%(n=99),垃圾回收的时间是指所有代中垃圾回收的总时间。如果吞吐量的模板没达到,那么代就会增大以期增加应用程序在回收之间的时间,一个大的代会需要更多时间才能充满。

空间使用率目标

如果吞吐量和最大停顿时间的模板都达到了,垃圾回收器会减少堆的大小直到其中一个目标实现不了,没有达到前面两个目标就达到了这个目标。

目标优先级

并行垃圾回收器首先尝试去达到最大停顿时间,只有在满足这个目标后才去处理吞吐量目标,显而易见,空间使用率目标就放在最后来达到。

猜你喜欢

转载自blog.csdn.net/Android_app/article/details/77069516