03_jvm性能调优_影响垃圾收集性能的一些选项

影响垃圾回收性能的两个最重要因素是总可用内存和分配给年轻代的堆内存比例

总的堆大小

垃圾回收性能最重要的因素是总可用内存。由于在各代填满时进行垃圾回收,所以吞吐量与内存大小相关联。

注意:下面关于增长和缩小堆、堆布局和默认值的讨论以串行收集器为例。尽管其他收集器使用类似的机制,但这里提供的详细信息可能不适用于其他收集器。有关其他收集器的类似信息,请参考相应的主题。

影响分代大小的一些选项

有一些选项会影响代的大小。图4-1展示了堆中承诺空间和虚拟空间之间的差异。在虚拟机初始化时,整个堆的空间都被保留下来。可以使用-Xmx选项指定保留的空间大小。如果-Xms参数的值小于-Xmx参数的值,那么并不是所有保留的空间都会立即分配给虚拟机。在这张图中,未分配的空间被标记为“虚拟”。堆的不同部分,即老年代和年轻代,可以根据需要增长到虚拟空间的极限大小。

一些参数是堆的不同部分之间的比例。例如,参数-XX:NewRatio表示老年代相对于年轻代的大小。

堆大小的默认选择项

默认情况下,虚拟机在每次垃圾回收时会尝试扩大或缩小堆,以保持每次垃圾回收时自由空间与存活对象的比例在特定范围内。

这个目标范围通过选项-XX:MinHeapFreeRatio=<最小值>和-XX:MaxHeapFreeRatio=<最大值>以百分比的形式设置,堆的总大小下限由-Xms<最小值>设定,上限由-Xmx<最大值>设定。

使用这些选项,如果某一代中的空闲空间百分比低于40%,那么该代会扩张以保持40%的自由空间,扩张至该代允许的最大大小。同样地,如果空闲空间超过70%,那么该代会收缩,使得只有70%的空间是自由的,在不低于该代最小大小的情况下。

Java SE中用于并行收集器的计算现在适用于所有垃圾收集器。其中一部分计算是64位平台上最大堆大小的上限。有关Parallel Collector默认堆大小,请参见相关文档。对于客户端JVM也有类似计算,结果是较服务器JVM更小的最大堆大小。

以下是关于服务器应用程序堆大小的一般指导方针:

  • 除非你遇到暂停问题,尽量为虚拟机分配尽可能多的内存。默认大小通常太小。
  • 将-Xms和-Xmx设置为相同的值可以通过从虚拟机中移除最重要的尺寸决策来增加可预测性。然而,如果选择不当,虚拟机就无法进行补偿。
  • 一般来说,随着处理器数量的增加,增加内存,因为分配可以并行进行。

通过最小化 Java 堆大小来保持动态内存占用

如果你需要最小化应用程序的动态内存占用(执行过程中消耗的最大内存),则可以通过减少Java堆大小来实现。Java SE嵌入式应用程序可能需要这样做。

通过降低命令行选项-XX:MaxHeapFreeRatio(默认值为70%)和-XX:MinHeapFreeRatio(默认值为40%)的数值来最小化Java堆大小,使用-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio命令行选项。将-XX:MaxHeapFreeRatio降低至至少10%,并将-XX:MinHeapFreeRatio调整到较低水平已被证明可以成功减少堆大小而不会出现太大的性能下降;然而,结果可能会因应用程序而异。尝试不同的参数值,直到它们尽可能低,同时仍保持可接受的性能。

此外,还可以指定-XX:-ShrinkHeapInSteps来立即将Java堆缩小到目标大小(由参数-XX:MaxHeapFreeRatio指定)。使用此设置可能会导致性能下降。默认情况下,Java运行时逐步减少Java堆至目标大小;这个过程需要多次垃圾回收循环。

年轻代

在可用内存之后,影响垃圾回收性能的第二个最重要因素是年轻代所占堆空间的比例。

年轻代越大,Minor GC发生的频率就越低。然而,对于有限的堆大小来说,较大的年轻代意味着较小的老年代,这将增加主要垃圾回收发生的频率。最优选择取决于应用程序分配对象的生命周期分布情况。

年轻代大小选项

默认情况下,年轻代的大小由选项-XX:NewRatio控制。

例如,设置-XX:NewRatio=3意味着年轻代和老年代的比例为1:3。换句话说,伊甸园区和幸存者区的大小将是总堆大小的四分之一。

选项-XX:NewSize和-XX:MaxNewSize限制了年轻代的下限和上限。将它们设置为相同的值将固定年轻代的大小,就像将-Xms和-Xmx设置为相同的值固定了总堆大小一样。这对于以比-XX:NewRatio允许的整数倍更精细地调整年轻代大小非常有用。

幸存区大小选项

你可以使用选项-XX:SurvivorRatio来调整幸存者空间的大小,但通常这对性能并不重要。

例如,-XX:SurvivorRatio=6将伊甸园和一个幸存者空间之间的比例设置为1:6。换句话说,每个幸存者空间将是伊甸园大小的六分之一,因此是年轻代大小的八分之一(不是七分之一,因为有两个幸存者空间)。

如果幸存者空间太小,那么拷贝回收操作会直接溢出到老年代。如果幸存者空间太大,则它们将是无用的空间。在每次垃圾回收时,虚拟机会选择一个阈值(threshold),即对象在变老之前可以被拷贝的次数。这个阈值是为了保持幸存者区域半满而选择的。你可以使用日志配置-Xlog:gc,age来显示这个阈值以及新生代中对象的年龄。这对于观察应用程序的寿命分布也是非常有用的。

表4-1提供了幸存者空间大小的默认值。

OptionDefault Value

-XX:NewRatio

2

-XX:NewSize

1310 MB

-XX:MaxNewSize

not limited

-XX:SurvivorRatio

8

年轻代的最大大小是根据总堆的最大大小和-XX:NewRatio参数的值计算得出的。-XX:MaxNewSize参数的默认值是"不限制",这意味着计算得出的值不会受到-XX:MaxNewSize参数的限制,除非在命令行上明确指定了-XX:MaxNewSize的值。 

以下是服务器应用程序的一般指导原则:

  • 首先确定您可以为虚拟机提供的最大堆大小。然后,以性能指标为横轴,年轻代大小为纵轴,绘制性能曲线以找到最佳设置。
    • 请注意,最大堆大小应始终小于计算机上安装的内存量,以避免过多的页面错误和抖动。
  • 如果总堆大小固定,则增加年轻代大小需要减少老年代的大小。保持足够大的老年代来容纳应用程序在任何给定时间使用的所有活动数据,再加上一些松散空间(10%到20%或更多)。
  • 在满足上述老年代约束条件的前提下:
    • 为年轻代分配足够多的内存。
    • 随着处理器数量增加,增加年轻代大小,因为分配可以并行化进行。
  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值