CMS 垃圾收集器 - 什么时候运行?
-
13-12-2019 - |
题
我对可能控制 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