我已阅读this article关于虚拟机垃圾收集调整以更好地理解Java垃圾收集器。每个空间都有一个 Virtual 堆空间区域,随着所需的堆空间越来越接近最大堆大小,它可以增长。这可以在这张图片中看到: Java GC arrangement of generations http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif
您可以使用 NewRatio 参数设置 Young Generation 和 Old(Tenured)Generation 之间的比率,以及之间的比率带有 SurvivorRatio 参数的Eden Space 和 Survivor Space 。
最近有人询问this question找出堆空间的默认比率。它说您应该使用 PrintGCDetails 参数并手动计算比率。
我的问题是:不同堆空间的大小是否以相同的比率增加,从而在应用程序的整个运行时期间保持它们在启动时设置的比率不变?例如,如果Young Generation和Old / Tenured Generation的默认NewRatio为3,则Young的初始保留堆空间为100MB,Old为300MB。如果需要为旧空间预留更多内存,可以说300MB以上,总计600MB。为Young Space保留的内存是否也会增加到200MB,保持比例不变?
答案 0 :(得分:9)
我认为您指的是 GC人体工程学和自适应尺寸政策
-XX:SurvivorRatio=
。您可以使用-XX:-UseAdaptiveSizePolicy
停用 自适应尺寸政策。禁用AdaptiveSizePolicy后,GC将遵循启动参数指定的代的初始大小(例如-Xms
,-Xmx
,-XX:MaxNewSize=
,-XX:NewSize=
,{{ 1}})它们将保持不变。
您可以在UseAdaptiveSizePolicy and other jvm opts中找到有关自适应尺寸政策的更多信息。
答案 1 :(得分:1)
PermGen vs Young生成比率由JVM部分维持,但是如果保持比率,答案是否。
JVM7变得足够先进和复杂,我们不应该预测堆内代的分配。
在JVM运行的每个GC周期中,它还会进行度量分析,以了解当前应用程序的内存存储行为。
- 如果更多对象在GC的多个循环中存活,则会减少PermGen并将一些空间分配给YoungGeneration。基本上No. of objects
x number of GC cycles they skip
会动态调整生成比率。
我希望它有所帮助,谢谢。
答案 2 :(得分:1)
编辑:我想我可能有些不对劲。在我调查的时候把这个笔记放在这里,以防止人们走错路!
如果您使用Parallel Scavenge GC(-XX:+UseParallelGC
),Ales0x的答案很好,但Concurrent Mark-Sweep GC(-XX:+UseConcMarkSweepGC
)不支持自适应大小调整。
使用Concurrent Mark-Sweep,新/年代生成大小基于初始堆大小设置(除非您指定-XX:NewSize=
)。随着堆的增长,新一代的大小不会发生变化。