CMS垃圾收集器 - 什么时候运行?

Kon*_*rus 10 java garbage-collection concurrent-mark-sweep

我很困惑可能控制CMS收集器何时启动的两个参数:

MaxHeapFreeRatio (默认为70%)

CMSInitiatingOccupancyFraction (默认超过90%)

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

moo*_*ody 12

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?video_id = 6486089

  • `CMSInitiatingOccupancyFraction`仅用于第一个集合,除非设置了`-XX:+ UseCMSInitiatingOccupancyOnly`.如果您没有设置后一个开关,那么在第一个之后,通常的启发式(基于在运行时收集的分配统计信息)用于确定CMS何时启动. (4认同)