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人体工程学和适应性尺寸政策
-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=
)。 随着堆的增长,新一代的规模不会改变。
上一篇: Are ratios between spaces/generations in the Java Heap constant?