一个 JVM 参数引发的频繁 CMS GC( 七 )

看上面的日志 , 你会发现这次 CMS GC 日志跟以往的都不太一样 , CMS-concurrent-mark-start 日志出现后 , 后面的日志都不是按照 CMS GC 的各个阶段打出来的 。 是的 , 后面其实是由于 Allocation Failure 而发生了一次 Young GC , 从而中断了 CMS background collector , 而进行了一次 CMS foreground collector , 有 “concurrent mode failure” 为证 。
也就是说一般的 Allocation Failure 引起的 YoungGC 在这种情况下 , 不会出现频繁 CMS GC , 因此 , 把问题归结到 -XX:CMSScavengeBeforeRemark 参数不为过吧 。
总结本文主要是由于 -XX:CMSScavengeBeforeRemark 参数触发了 Young GC , 但该 YoungGC 并没有成功进行的 , 反而促使 CMS background collector 触发条件满足 , 进而引发了频繁 CMS GC 。
该怎么避免呢【一个 JVM 参数引发的频繁 CMS GC】一时也没有想到很好的办法 , 两个参考方案:

  • 去掉 -XX:CMSScavengeBeforeRemark 参数
  • 降低 YoungGen 大小 , 加快因 Allocation Failure 而触发正常 Young GC


推荐阅读