Java 并发模式失败,而完全GC

Java 并发模式失败,而完全GC,java,concurrency,garbage-collection,jvm,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]

我正面临并发模式故障的发生,因此我的应用程序响应缓慢。正如我看到许多博客建议降低占用率并进行检查一样,这是并发模式故障的唯一解决方案吗



    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


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

CMS:由于时间原因而中止预清洁

这意味着并行预清洁阶段(您的CMS GC基本上会加速并降低以后停止世界暂停的可能性)正在中止,因此停止世界暂停的频率将比需要的频率更高

这样,您应该考虑增加预精简阶段的超时时间。这可以通过手动将-XX:CMSMaxAbortablePrecleanTime JVM参数设置为大于5秒的值来实现

我对此做了一些研究,在这个问题上已经有了一个很好的Q/a。还有一个很好的Oracle博客,详细介绍了CMS收集器的不同阶段,包括描述。最后一个参考详细说明了


另一方面,这里有几个JVM的调优参数。虽然它们可能有助于提高绩效,但也可能没有。事实上,设置几个JVM参数通常会限制JVM为自定义应用程序优化垃圾收集的能力。考虑一下移除这些调谐参数来改善你的性能问题。

你读到了吗?是的,我已经走了,但是我仍然无法弄清楚,如果你经历过这些,你到底尝试了什么?什么java版本?有多少核?你能提供完整的GC日志(上传/粘贴)吗?jdk版本:1.6.0_32-b05,因为我无法尝试,bcoz thits发生在客户站点。有人抱怨应用程序太慢,占用了更多的cpu时间。正如我们看到的[CMS并发标记:4.651/4.658秒][时间:user=18.04 sys=0.36,real=4.65秒]它会影响我们应用程序的性能吗?