CMS垃圾收集器 – 什么时候运行?
我很困惑可能控制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=
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
默认情况下,虚拟机会在每个集合中增大或缩小堆,以尝试将可用空间的比例保持在特定范围内每个集合的活动对象。 此目标范围通过参数
-XX:MinHeapFreeRatio=
和-XX:MaxHeapFreeRatio=
设置为百分比,并且总大小在-Xms
以下由-Xms
以上限制。
.. 要么 ..
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 logging和两个测试参数)
我还发现了一个关于此的旧bug报告: http : //bugs.sun.com/bugdatabase/view_bug.do?video_id = 6486089