Java 堆中空间/代数之间的比率是否恒定?

2022-09-04 21:55:41

我已经阅读了这篇关于虚拟机垃圾回收调优的文章,以更好地了解java垃圾回收器。每个空间都有一个虚拟堆空间区域,随着所需堆空间越来越接近最大堆大小,它可以增长到该区域。这可以从这张照片中看到:Java GC arrangement of generations
(来源:oracle.com

您可以使用 NewRatio 参数设置年轻一代老一代(终身制)之间的比率,并使用 SurvivorRatio 参数设置伊甸园空间幸存者空间之间的比率。

最近,有人问这个问题,关于找出堆空间的默认比率。它说你应该使用PrintGCDetails参数并手动计算比率。

我的问题是:不同堆空间的大小是否以相同的比率增加,从而在应用程序的整个运行时保持它们在启动时设置的比率恒定?例如,如果年轻一代和老/终身一代的默认 NewRatio 为 3,并且初始保留堆空间对于年轻一代为 100MB,对于旧代为 300MB。如果需要为旧空间保留更多内存,假设再增加300MB,使其总共为600MB。为Young Space保留的内存是否也翻了一番,达到200MB,保持比率不变?


答案 1

我认为您指的是GC人体工程学自适应尺寸政策

  • Hotspost GC 的一项功能,可根据正在运行的应用程序的当前分配行为,在运行时自动调整代系的大小
  • 默认情况下,此功能处于启用状态,并在运行时控制/调整世代的大小。
  • 实际上,如果您不禁用自适应大小策略,某些GC参数将被忽略,例如。.-XX:SurvivorRatio=

您可以使用 禁用自适应大小策略。禁用 AdaptiveSize 策略后,GC 将遵循启动参数(例如 、 ) 指定的代数的初始大小,并且它们将保持不变。-XX:-UseAdaptiveSizePolicy-Xms-Xmx-XX:MaxNewSize=-XX:NewSize=-XX:SurvivorRatio=

您可以在 UseAdaptiveSizePolicy 和其他 jvm 选项中找到有关自适应大小策略的更多信息。


答案 2

PermGen与年轻一代的比例部分由JVM维持,但要说如果保持比率,答案是否定的

JVM7已经变得足够先进和复杂,我们不应该预测堆内世代的分配。

在 JVM 运行的每个 GC 周期中,它还会执行指标分析,以了解当前应用程序的内存存储行为。- 如果更多的物体在GC的多个周期中幸存下来,那么PermGen就会减少,一些空间就会分配给YoungGeneration。基本上,x在动态调整生成率方面起着一个标准。No. of objectsnumber of GC cycles they skip

我希望它有帮助,谢谢。