1
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

4

1 回答 1

0

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

Old 空间收集已经安排好了,所以 JVM 没有进行 Full GC,而是等待 Old 空间 GC 完成(并且它已经释放了足够的空间来完成 Young GC)。

在 CMS 模式下 FullGC - 被实现为 stop-the-world Mark Sweep Compact,它清除年轻和旧的旧 GC - 是在后台工作的并发标记扫描算法,它只清除旧空间

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

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

-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly

您可以在我的博客中找到有关调整 CMS 的更多信息。

于 2013-11-06T08:26:37.723 回答