我观察到,当没有最近的ParNew,然后如果CMS-Initial-Mark阶段启动时,CMS-Initial-Mark阶段需要更长的时间来标记旧一代的对象。
好的部分是大多数时候我发现ParNew(可能偶然或者JVM在内部执行此操作)恰好在CMS-Initial-Mark阶段之前发生,然后在旧一代中标记相同数量的对象,CMS需要更少的时间。
想知道这一观察背后的原因。
注意:考虑到CMS-Initial-Mark阶段是世界末日,应尽最大努力缩短其持续时间。
答案 0 :(得分:6)
正常情况下CMS初始标记搭载年轻的收藏品。 CMS可以等待一段时间的年轻收集(默认为2秒)。如果没有发生,初始标记将使用单线程扫描所有年轻空间,这可能非常耗时。
阅读http://blog.ragozin.info/2011/06/understanding-gc-pauses-in-jvm-hotspots_02.html了解详情。
HotSpot选项-XX:CMSWaitDuration =<以ms为单位的延迟>控制CMS初始标记可以延迟到背负年轻集合的时间。