2012-03-14 60 views
9

我感到困惑的是可以控制两个参数时,在CMS收集踢:CMS垃圾回收器 - 它何时运行?

MaxHeapFreeRatio(70默认%)

CMSInitiatingOccupancyFraction(超过90%的默认值)

什么每个那些参数意味着什么?收集器何时开始(标记阶段),并收集(​​清扫阶段)?

回答

11

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限定在以下,并且由-Xmx限定。为32位的Solaris操作系统(SPARC平台版)的默认参数示于该表中:

.. ..或

http://www.petefreitag.com/articles/gctuning/

-XX:MaxHeapFreeRatio - 当空闲百分比一代中的空间超过这个数值,这代就会缩小以达到这个数值。默认是70

编辑:我跑了一个测试程序,只是随机创建字节数组映射和复制他们周围的几个模拟。我注意到a)分数值没有得到尊重 - 特别是保守值(比如说50),CMS初始标记阶段的入住率超过了50%,一般在70-80%左右,b)尽管如此,较小的分数值使CMS初期发生较早 (程序中使用-Xmx1536m -Xmx1536m -XX:新尺寸=512米-XX:+ UseConcMarkSweepGc + GC记录和两个测试参数)

我还发现这方面的老错误报告:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction'仅用于第1个集合,除非设置了“-XX:+ UseCMSInitiatingOccupancyOnly”。如果您没有设置后一个开关,那么在第一个开关之后,将使用通常的启发式(基于运行时收集的分配统计信息)来确定何时启动CMS。 – Matt 2012-03-14 10:16:30

+0

谢谢马特,我补充说。 – moodywoody 2012-03-14 10:22:49

+0

从一些观测好像几个夜间使用率较低,直至达到90%以上并没有踢后(也就是'CMSInitiatingOccupancy'。不过,白天它似乎并没有等待,只要收集,但越早。这似乎对应于@Matt所说的,但在这种情况下,我想知道“通常的启发式”是什么,和平时间会使它休眠多久并等待> 90%的阈值。 – 2012-03-14 11:21:44