You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JVM中NewRatio语义是否变更?Oracle文档与Java 17实际运行结果不符的疑问

JVM中NewRatio语义是否变更?Oracle文档与Java 17实际运行结果不符的疑问

我最近在研究JVM的NewRatio参数时,遇到了一个和官方文档描述不符的情况,想和大家一起探讨下问题出在哪。

按照官方文档的说明(我特意标了重点):

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

相关技术问答社区的讨论也支持这个结论:NewRatio的数值越高,老年代相对于年轻代的占比就越大,而不是反过来。

但我在Java 17环境下实际测试时,却得到了完全相反的结果。我执行了以下命令查看参数:

java -XX:MaxHeapSize=100M -XX:+PrintFlagsFinal -version | grep -E "MaxHeapSize|MaxNewSize|NewRatio"

输出结果显示,MaxNewSize(年轻代的最大值)居然占了MaxHeapSize的2/3,比老年代的占比还大,这和文档里的结论完全相反:

size_t MaxHeapSize                              = 104857600                                 {product} {command line}
   size_t MaxNewSize                               = 62914560                                  {product} {ergonomic}
    uintx NewRatio                                 = 2                                         {product} {default}
   size_t SoftMaxHeapSize                          = 104857600                              {manageable} {ergonomic}

openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)

为了对比,我又在Java 8环境下做了同样的测试,结果就完全符合文档的描述了:

java -Xmx100M -XX:+PrintFlagsFinal -version | grep -E "MaxHeapSize|MaxNewSize|NewRatio"

输出如下:

uintx MaxHeapSize                              := 109051904                           {product}
    uintx MaxNewSize                               := 36175872                            {product}
    uintx NewRatio                                  = 2                                   {product}
openjdk version "1.8.0_392"
OpenJDK Runtime Environment Corretto-8.392.08.1 (build 1.8.0_392-b08)
OpenJDK 64-Bit Server VM Corretto-8.392.08.1 (build 25.392-b08, mixed mode)

可以看到,同样是MaxHeapSize=100M、默认NewRatio=2的配置,Java 17的MaxNewSize是62914560,而Java 8是36175872,两者的年轻代占比差异非常明显。

不过我后来发现,如果显式指定-XX:NewRatio=2,Java 17就会输出符合文档预期的结果,和Java 8的表现一致:

java -XX:MaxHeapSize=100M -XX:NewRatio=2 -XX:+PrintFlagsFinal -version | grep -E "MaxHeapSize|MaxNewSize|NewRatio"

输出结果:

size_t MaxHeapSize                              = 104857600                                 {product} {command line}
   size_t MaxNewSize                               = 34603008                                  {product} {ergonomic}
    uintx NewRatio                                 = 2                                         {product} {command line}
   size_t SoftMaxHeapSize                          = 104857600                              {manageable} {ergonomic}
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)

现在我特别困惑:这到底是JVM的一个bug,还是自适应调整(ergonomics)的逻辑发生了变化,只是官方文档没有及时更新?有没有了解JVM底层的大佬能给我指个方向?

备注:内容来源于stack exchange,提问作者Turkhan Badalov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:48:03