我对可能控制 CMS 收集器何时启动的两个参数感到困惑:
MaxHeapFreeRatio
(默认为 70%)
CMSInitiatingOccupancyFraction
(默认超过 90%)
这些参数中的每一个到底是什么意思?收集器何时开始(标记阶段)和收集(清扫阶段)?
我对可能控制 CMS 收集器何时启动的两个参数感到困惑:
MaxHeapFreeRatio
(默认为 70%)
CMSInitiatingOccupancyFraction
(默认超过 90%)
这些参数中的每一个到底是什么意思?收集器何时开始(标记阶段)和收集(清扫阶段)?
CMSInitiatingOccupancyFraction
决定 CMS 何时启动(为了使此选项有效,您还必须设置-XX:+UseCMSInitiatingOccupancyOnly
)。MaxHeapFreeRatio
是调整世代空间大小的选项。
例如见...
http://java.sun.com/docs/hotspot/gc1.4.2/faq.html
并发收集通常无法加速,但可以更早地启动。当老年代中分配的空间百分比超过阈值时,并发收集开始运行。此阈值是根据并发收集器的一般经验计算得出的。如果正在发生完整收集,则可能需要更早地启动并发收集。命令行标志 CMSInitiatingOccupancyFraction 可用于设置开始收集的级别。其默认值约为 68%。调整值的命令行是
-XX:CMSInitiatingOccupancyFraction=<percent>
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
默认情况下,虚拟机会在每个集合处增大或缩小堆,以尝试将每个集合处的可用空间与活动对象的比例保持在特定范围内。此目标范围由参数
-XX:MinHeapFreeRatio=<minimum>
和设置为百分比-XX:MaxHeapFreeRatio=<maximum>
,并且总大小的范围为低于-Xms
和高于-Xmx
。
.. 或者 ..
http://www.petefreitag.com/articles/gctuning/
-XX:MaxHeapFreeRatio
- 当一代中可用空间的百分比超过此值时,一代将缩小以满足该值。默认值为 70
编辑:我用一个测试程序运行了一些模拟,该程序只是随机创建字节数组的映射并将它们复制。我注意到 a) 分数值没有得到尊重 - 特别是在保守值(比如 50)的情况下,CMS 初始标记阶段的占用率远远超过 50%,通常在 70-80% 左右,b) 尽管如此,更小的分数值使 CMS初始阶段发生得更早(使用-Xmx1536m -Xmx1536m -XX:NewSize=512m -XX:+UseConcMarkSweepGc
的程序 + gc 日志记录和两个测试参数)
我还发现了一个关于此的旧错误报告:http ://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089