Java堆中的空间/世代之间的比率是不变的?

我已经阅读了关于虚拟机垃圾收集调优的文章,以更好地理解Java垃圾收集器。 每个空间都有一个虚拟堆空间区域,随着堆空间需要更接近最大堆大小,它可以增长。 这可以在这张图中看到:世代的Java GC安排http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif

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

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

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


我想你是指GC人体工程学适应性尺寸政策

  • Hotspost GC的一项功能,可根据正在运行的应用程序的当前分配行为自动调整 运行时代的大小
  • 此功能默认为开启,并在运行时控制/调整世代的大小。
  • 实际上,如果您不禁用自适应大小策略, 某些 GC参数将被忽略 ,例如。 -XX:SurvivorRatio=
  • 您可以使用-XX:-UseAdaptiveSizePolicy 禁用 自适应大小策略 。 一旦禁用了AdaptiveSizePolicy,GC将按照启动参数(例如-Xms-Xmx-XX:MaxNewSize= ,- -XX:NewSize= ,- -XX:SurvivorRatio= )的规定来尊重代的初始大小将保持不变。

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


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

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

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

    我希望它有帮助,谢谢。


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

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

    使用并行标记扫描,新/新一代大小基于初始堆大小设置(除非指定-XX:NewSize= )。 随着堆的增长,新一代的规模不会改变。

    链接地址: http://www.djcxy.com/p/82893.html

    上一篇: Are ratios between spaces/generations in the Java Heap constant?

    下一篇: size causes JVM cannot be started