JDK8垃圾回收调优指南--(4)设置代大小

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

许多参数会影响代的大小。图4-1说明了堆中提交空间和虚拟空间之间的差异。在虚拟机初始化时,为堆保留了整个空间。
(堆)保留空间的大小可以使用'-Xmx'选项指定。如果'-Xms'参数的值小于'-Xmx'参数的值,则不是所有保留的空间都立即提交给虚拟机。图中未提交的空间被标记为“virtual”。堆的不同部分(年轻代和老年代)可以根据需要增长到虚拟空间的极限。

有些参数是堆的一部分与另一部分的比值。例如,参数'NewRatio'表示老年代相对于年轻代的大小。

Heap Parameters

Total Heap

下面关于堆的增长和收缩以及默认堆大小的讨论不适用于并行收集器(有关使用并行收集器调整堆大小和默认堆大小的详细信息,请参阅并行收集器部分)。然而,控制堆总大小和代大小的参数的确适用于并行收集器。

影响垃圾收集性能的最重要因素是最大可用内存。每当代被占满时就会触发垃圾回收,所以吞吐量与可用内存的数量成反比。

默认,虚拟机在每次GC时增加或减少堆大小,以将每次GC后空闲空间和存活对象的比例保持在特定范围内。该目标范围由参数'-XX:MinHeapFreeRatio=<minimum>'和'-XX:MaxHeapFreeRatio=<maximum>'设置为百分比,总大小以'-Xms<min>'为下限,以'-Xmx<max>'为上限。64位Solaris操作系统(SPARC Platform Edition)的默认参数如表4-1所示:

有了这些参数,如果代的空闲空间百分比低于40%,那么这个代将被扩展,以保持40%的空闲空间,最高可达这个代允许的最大值。同样,如果空闲空间百分比超过70%,那么代将会被压缩以满足只有70%的空间是空闲的,以代的最小尺寸为准(压缩到最小值时,不会再压缩)。

正如表4-1所示,默认堆最大值是由JVM计算的。Java SE中用于并行收集器和服务器JVM的(最大堆)计算现在用于所有垃圾收集器。计算的最大堆值对于32位平台和64位平台是不同的。参见并行收集器Default Heap Size部分。客户机JVM也有类似的计算,(只是)它的最大堆值小于服务器JVM。

以下是关于服务器应用程序堆大小的一般准则:

  • 除非您对GC停顿有疑问,否则请尝试将尽可能多的内存分配给虚拟机。默认堆值通常太小。
  • 将'-Xms'和'-Xmx'设置为相同的值可以通过从虚拟机中移除最重要的sizing决策来提高可预测性。然而,如果您做出了错误的选择,虚拟机将无法进行补偿。
  • 通常,随着处理器数量的增加而增加内存,因为内存分配可以并行化。

The Young Generation

除了最大可用内存之外,影响垃圾收集性能的第二大因素是用于年轻代的堆的比例。年轻代(内存)越大,'minor collection'的频率越低。然而,对于有限制的堆大小(比如Xms=Xmx),较大的年轻代意味着较小的老年代,这将增加'major collection'的频率。最优选择取决于应用程序分配的对象的生存期的分布情况。

默认情况下,年轻代的大小由参数'NewRatio'控制。例如,设置'-XX:NewRatio=3'意味着年轻代和老年代的比例为1:3。
换句话说,eden和survivor空间的总大小(即年轻代)是总堆大小的四分之一。

参数'NewSize'和'MaxNewSize'约束了年轻代的边界值。将这些值设置为相同的值可以固定年轻代大小,就像将'-Xms'和'-Xmx'设置为相同的值将固定总堆大小一样。这比参数'NewRatio'定义的整数倍地调优年轻代更有用,更细的粒度。

Survivor Space Sizing

您可以使用参数'SurvivorRatio'来调整Survivor空间的大小,但这通常对性能并不重要。例如,'-XX:SurvivorRatio=6'将eden和survivor空间的比例设置为1:6。换句话说,每个survivor空间的大小将是eden的六分之一,因此survivor将是年轻代的八分之一(不是七分之一,因为有两个survivor空间)。

如果survivor空间太小,则复制回收将直接溢出到老年代。如果survivor的空间太大,他们将是无用的空(空间浪费)。
在每次垃圾收集时,虚拟机都会选择一个阈值数字,就是一个对象在被提升到老年代之前可以被复制的次数。选择这个阈值是为了让survivor的内存占用控制在一半。命令行选项'-XX:+PrintTenuringDistribution'(不是在所有垃圾收集器上都可用)可用于显示年轻代对象的阈值和年龄。它对于观察应用程序的对象生命周期分布也很有用。

表4-2提供了Solaris系统的默认值:

Default Parameter Values for Survivor Space Sizing

年轻代最大值可以通过总堆的最大值和'NewRatio'参数的值计算而来(MaxNewSize = Xmx * (1/1+NewRatio))。参数'MaxNewSize'默认值"not limited"意味着计算值不受'MaxNewSize'的限制,除非在命令行中指定'MaxNewSize'的值。

以下是服务应用的一般准则:

  • 首先确定你能提供给虚拟机最大堆值的大小。然后根据年轻代的大小绘制性能指标,以找到最佳设置。
  1. 注意,堆内存最大值应该始终小于机器上安装的内存大小,以避免过多的页面错误(page)和抖动(thrashing)。
  • 如果总堆值是固定的,那么增加年轻代大小需要减少老年代大小。保持老年代足够大,以便在任何给定的时间都能容纳应用程序使用的所有存活数据,加上一定数量的闲置空间(10到20%或更多)。
  • 受上述对老年代的限制:
  1. 给年轻代分配足够的内存。
  2. 随着处理器数量的增加,增加年轻代的大小,因为内存分配可以并行化。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值