完整GC时并发模式失败

时间:2015-10-07 06:38:45

标签: java concurrency garbage-collection jvm

我正面临并发模式故障,由于我的应用程序响应缓慢。正如我看到许多博客建议降低占用率和检查,这是并发模式失败的唯一解决方案吗?



    CMS: abort preclean due to time 2015-09-16T23:18:41.306+0200: 3847212.463: [CMS-concurrent-abortable-preclean: 4.934/5.444 secs] [Times: user=5.00 sys=0.01, real=5.45 secs]
    2015-09-16T23:18:41.311+0200: 3847212.467: [GC[YG occupancy: 266211 K (436928 K)]3847212.467: [Rescan (parallel) , 0.1478990 secs]3847212.615: [weak refs processing, 0.0000180 secs] [1 CMS-remark: 3073996K(4718592K)] 3340208K(5155520K), 0.1480950 secs] [Times: user=1.57 sys=0.01, real=0.15 secs]
    2015-09-16T23:18:41.460+0200: 3847212.616: [CMS-concurrent-sweep-start]
    2015-09-16T23:18:44.204+0200: 3847215.360: [CMS-concurrent-sweep: 2.738/2.744 secs] [Times: user=2.76 sys=0.00, real=2.74 secs]
    2015-09-16T23:18:44.204+0200: 3847215.360: [CMS-concurrent-reset-start]
    2015-09-16T23:18:44.215+0200: 3847215.371: [CMS-concurrent-reset: 0.010/0.010 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
    2015-09-16T23:18:46.221+0200: 3847217.377: [GC [1 CMS-initial-mark: 3073996K(4718592K)] 3347513K(5155520K), 0.3326130 secs] [Times: user=0.33 sys=0.00, real=0.33 secs]
    2015-09-16T23:18:46.554+0200: 3847217.710: [CMS-concurrent-mark-start]
    2015-09-16T23:18:46.926+0200: 3847218.083: [Full GC 3847218.083: [CMS2015-09-16T23:18:50.249+0200: 3847221.405: [CMS-concurrent-mark: 3.688/3.695 secs] [Times: user=13.96 sys=0.31, real=3.70 secs]
     (concurrent mode failure): 3073996K->3011216K(4718592K), 20.7183280 secs] 3348996K->3011216K(5155520K), [CMS Perm : 262143K->40538K(262144K)], 20.7185010 secs] [Times: user=29.87 sys=0.31, real=20.71 secs]
    2015-09-16T23:27:27.701+0200: 3847738.857: [GC 3847738.858: [ParNew: 349568K->28669K(436928K), 0.0532300 secs] 3360784K->3039885K(5155520K), 0.0534380 secs] [Times: user=0.14 sys=0.00, real=0.05 secs]
    2015-09-16T23:33:43.242+0200: 3848114.399: [GC 3848114.399: [ParNew: 378237K->14730K(436928K), 0.0492570 secs] 3389453K->3025946K(5155520K), 0.0494510 secs] [Times: user=0.14 sys=0.00, real=0.05 secs]
    2015-09-16T23:41:35.879+0200: 3848587.035: [GC 3848587.035: [ParNew: 364298K->15247K(436928K), 0.0524070 secs] 3375514K->3026463K(5155520K), 0.0525940 secs] [Times: user=0.15 sys=0.00, real=0.05 secs]
    

以下是设置的JVM参数:



    -server
    -d64
    -Xms2048M
    -Xmx2048M
    -XX:+DisableExplicitGC
    -XX:NewSize=512M
    -XX:MaxNewSize=512M
    -XX:SurvivorRatio=4
    -XX:PermSize=256M
    -XX:MaxPermSize=256M
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    -XX:CMSInitiatingOccupancyFraction=65
    -XX:+UseCMSInitiatingOccupancyOnly
    -XX:+CMSPermGenSweepingEnabled
    -XX:MaxTenuringThreshold=30

1 个答案:

答案 0 :(得分:1)

鉴于您已将CMSInitiatingOccupancyFraction设置为65%,如果您需要进一步降低它,我会感到惊讶。根据您上传的日志,您的问题的强大候选人似乎是预清洁阶段。从您的日志中,我看到以下开头的几条消息:

  

CMS:因时间而中止预清洗

这意味着并发预清洁阶段(您的CMS GC基本上可以加速并降低后来停止世界停顿的可能性)正在中止,因此世界停顿将会更频繁比他们需要的那样。

因此,您应该考虑增加预清洁阶段的超时。这可以通过手动将-XX:CMSMaxAbortablePrecleanTime JVM参数设置为大于5秒的时间来完成。

我对此做了一些研究,"abort preclean due to time"问题已经有了很好的StackOverflow Q / A.还有一个很好的Oracle博客,详细介绍了CMS收集器的不同阶段,包括描述what the CMS collector's preclean phase actually does。最后一篇参考资料详细介绍了syntax of the CMSMaxAbortablePrecleanTime JVM parameter

另外,您可以在此处为JVM提供多个调整参数。虽然他们可能在帮助表现,但他们也可能不会。实际上,设置多个JVM参数通常会限制JVM优化自定义应用程序的垃圾收集的能力。请考虑尝试删除其中一些调整参数,以改善性能问题。