如何调整年轻一代的规模?

时间:2017-02-06 09:37:12

标签: java jvm performance-testing jvm-arguments jvm-hotspot

我试图了解用于定义 JVM堆大小的不同参数。

    <jdkarg value="-Xmx20000M"/>
    <jdkarg value="-Xms10000M"/>
    <jdkarg value="-XX:NewSize=2500M"/>
    <jdkarg value="-XX:NewRatio=1"/>
    <jdkarg value="-XX:MaxNewSize=5000"/>

在这里,我知道这些 jdkarg 的含义是什么,让我感到困惑的是,我在某处读到了如果我定义 -XX:NewSize -XX:NewRatio 然后说明jvm将使用 -XX:NewSize 而不是 -XX:NewRatio 分配年轻代大小。

所以我在这里有一些问题:

  • 当我们定义 -XX:NewSize -XX:NewRatio 时,将使用 -XX:NewSize 定义初始年轻代的大小,这是对的吗?
  • 当堆大小增加到它的MAX(在这种情况下为20000M)时会发生什么,然后它如何定义最大年轻代大小,它将使用 -MaxNewSize -XX:NewRatio 或者没有一个会被使用,因为我有 -XX:NewSize

我尝试了很多谷歌搜索,但没有找到任何结论。 任何有助于理解这些arg的帮助将不胜感激。

更新

我得到的输出并不像预期的那样:

 S0C       S1C      S0U     S1U      EC       EU        OC         OU         PC       PU       YGC    YGCT   FGC      FGCT    GCT
426624.0 426624.0  0.0   426624.0 1706752.0 1013097.7 17920000.0 7208855.8  137032.0 82118.0   1952  130.126  24     20.441  150.567

这里我的旧空间为17920000,即17500 MB,年轻空间为2500 MB,这是我的初始值。

2 个答案:

答案 0 :(得分:1)

  

当我们定义-XX:NewSize和-XX:NewRatio然后初始年轻   生成大小将使用-XX:NewSize定义,是否正确?

如果与NewRatioNewSize

一起使用,则会忽略

MaxNewSize

  

当堆大小增加到它的MAX(在这种情况下为20000M)时会发生什么情况,   然后它如何定义最大年轻代大小,它将使用-MaxNewSize   或-XX:NewRatio或者它们都不会被使用,因为我有-XX:NewSize?

当使用NewSizeMaxNewSize时,年轻一代将介于这两种尺寸之间。但是当堆大小改变时,年轻代的大小不会相应改变。

Original source

答案 1 :(得分:1)

在这里,我指出了问题,以便在进一步之前可以注意到类似的事情,这导致了这种行为:

理想情况下,这应该是@Oleksandr提到的行为:

  

使用-XX:NewSize和-XX:MaxNewSize,年轻的gen将介于这两种尺寸之间。但是当堆大小改变时,年轻的基因大小不会相应地改变。

但是因为我有<jdkarg value="-XX:MaxNewSize=5000"/>意味着5000字节意味着它永远不会将Young Space增加到MaxNewSize,因为NewSize已经大了,正确的方法设置它的最大值 <jdkarg value="-XX:MaxNewSize=5000M"/>

当我进行此更改,即将已定义的大小添加为MB时,它会按预期提供内存分发。