13

我已经阅读了这篇关于虚拟机垃圾收集调优的文章,以更好地了解 Java 垃圾收集器。每个空间都有一个虚拟堆空间区域,随着所需的堆空间接近最大堆大小,它可以增长到该区域。这可以在这张图片中看到:( 来源:oracle.comJava GC 代数安排

您可以使用NewRatio参数设置年轻代旧(Tenured)代之间的比率,以及使用SurvivorRatio参数设置Eden SpaceSurvivor Space之间的比率。

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

我的问题是:不同堆空间的大小是否以相同的比率增加,从而在应用程序的整个运行时保持启动时它们之间设置的比率不变?例如,如果 Young Generation 和 Old/Tenured Generation 的默认 NewRatio 为 3,则初始保留堆空间为 Young 为 100MB,Old 为 300MB。如果需要为旧空间保留更多内存,可以说多 300MB,总共 600MB。为 Young Space 保留的内存是否也会翻倍至 200MB 以保持比例不变?

4

3 回答 3

9

我认为您指的是GC ErgonomicsAdaptive Size Policy

  • Hotspost GC 的一项功能,可在运行时根据正在运行的应用程序的当前分配行为自动调整生成的大小。
  • 此功能默认为 ON,并在运行时控制/调整代的大小。
  • 事实上,如果你不禁用自适应大小策略,一些GC 参数将被忽略,例如。-XX:SurvivorRatio=.

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

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

于 2013-03-15T23:32:11.763 回答
1

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

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

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

我希望它有帮助,谢谢。

于 2013-03-15T09:42:09.203 回答
1

编辑:我想我可能有问题。在我调查的时候把这张纸条放在这里,以免把人们误入歧途!

如果您使用的是 Parallel Scavenge GC ( -XX:+UseParallelGC),Ales0x 的答案非常好,但 Concurrent Mark-Sweep GC ( -XX:+UseConcMarkSweepGC) 不支持自适应大小。

使用 Concurrent Mark-Sweep,新/年轻代大小是根据初始堆大小设置的(除非您指定-XX:NewSize=)。新的代大小不会随着堆的增长而改变。

于 2013-11-21T18:33:00.597 回答