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

我已经阅读了这篇关于虚拟机垃圾收集调优的文章 ,以便更好地理解java垃圾收集器。 每个空间都有一个虚拟堆空间区域,随着所需的堆空间越来越接近最大堆大小,它可以增长。 这可以在这张图片中看到: 几代人的Java GC安排http://sofzh.miximages.com/java/190244.gif

您可以使用NewRatio参数设置Young GenerationOld(Tenured)Generation之间的比率,以及使用SurvivorRatio参数设置Eden SpaceSurvivor Space之间的比率。

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

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

我想你指的是GC人体工程学自适应大小政策

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

您可以使用-XX:-UseAdaptiveSizePolicy 禁用 自适应大小策略 。 一旦禁用了AdaptiveSizePolicy,GC将遵循启动参数指定的代的初始大小(例如-Xms-Xmx-XX:MaxNewSize= , – -XX:NewSize= , – -XX:SurvivorRatio= )将保持不变。

您可以在UseAdaptiveSizePolicy和其他jvm opts中找到有关Adaptive Size策略的更多信息。

PermGen vs Young生成比率由JVM部分维持,但是如果保持比率,答案是否定的

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

在JVM运行的每个GC周期中,它还会进行度量分析,以了解当前应用程序的内存存储行为。 – 如果更多对象在GC的多个循环中存活,则PermGen减少并且一些空间被分配给YoungGeneration。 基本上No. of objects number of GC cycles they skip x number of GC cycles they skip在动态调整生成比率时起到了一个标准。

我希望它有所帮助,谢谢。

编辑:我想我可能有问题。 在我调查的时候把这个笔记放在这里,以防止人们走错路!

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

使用Concurrent Mark-Sweep,新/年代生成大小基于初始堆大小设置(除非指定-XX:NewSize= )。 随着堆的增长,新一代的大小不会改变。