并发模式失败的问题

时间:2013-11-05 15:23:22

标签: java garbage-collection jvm heap jvm-arguments

Here are the gc log details

2013-10-30T17:37:27.285+0100: 1250455.686: [GC 1250455.686: [ParNew
        Desired survivor size 51445760 bytes, new threshold 1 (max 4)
        - age   1:   91404824 bytes,   91404824 total
        : 881572K->89325K(904384K), 0.0359086 secs] 2755473K->2052121K(2914176K)  icms_dc=100 , 0.0362248 secs] [Times: user=0.12 sys=0.00, real=0.04 secs] 

2013-10-30T17:37:27.714+0100: 1250456.115: [GC 1250456.116: [ParNew: 877881K->877881K(904384K), 0.0000232 secs]1250456.116: [CMS2013-10-30T17:37:27.937+0100: 1250456.338: [CMS-concurrent-mark: 2.608/3.118 secs] [Times: user=8.55 sys=0.14, real=3.12 secs] 
         **(concurrent mode failure):** 1962796K->1016548K(2009792K), 3.9820087 secs] 2840677K->1016548K(2914176K), [CMS Perm : 126257K->126176K(228356K)] icms_dc=100 , 3.9823002 secs] [Times: user=3.76 sys=0.01, real=3.98 secs] 

2013-10-30T17:37:31.717+0100: 1250460.122: [GC [1 CMS-initial-mark: 1016548K(2009792K)] 1038948K(2914176K), 0.0044446 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

我没有看到任何FULL GC发生。

问题是ParNew会增加并消耗整个CPU使用率。你有什么可以预测的吗?

JVM参数是这些

-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+CMSIncrementalMode
-XX:+CMSClassUnloadingEnabled
-XX:+PrintTenuringDistribution
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-XX:+DisableExplicitGC
-XX:MaxPermSize=256m
-Xmx2944m

-Xms2944m

1 个答案:

答案 0 :(得分:0)

并发模式失败意味着在年轻收集时,旧收集中的可用空间不足以容纳估计的待提升对象数量。

已经安排了旧的空间集合,因此JVM不再使用Full GC,而是等待Old space GC完成(并且它已经释放了足够的空间来完成年轻的GC)。

在CMS模式下 FullGC - 实现了世界各地的Mark Sweep Compact,可以清除年轻人和老年人 旧GC - 是在后台工作的并发标记扫描算法,只清除旧空间

并发模式失败可能会也可能不会触发Full GC(在您的情况下完成旧GC就足够了)

问题的根本原因是GC选项配置不正确。我建议你删除(因为他们干扰了-XX:+CMSIncrementalMode

-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly

您可以在my blog中找到有关调整CMS的更多信息。