我对可能控制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。
CMSInitiatingOccupancyFraction
仅在第一次回收时使用,除非设置了-XX:+UseCMSInitiatingOccupancyOnly
开关。如果没有设置后者开关,则在第一次之后,通常的启发式算法(基于运行时收集的分配统计信息)将用于确定何时启动CMS垃圾回收。 - MattCMSInitiatingOccupancy
)。然而,在白天它似乎不需要等待那么长时间,但会更早地进行收集。这似乎与@Matt所说的相符,但在这种情况下,我想知道“通常的启发式算法”是什么,以及和平时间有多长会使其进入休眠并等待>90%的阈值。 - Konrad Garus