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
相关产品推荐
相关产品推荐

