【问题标题】:Issues with Concurrent Mode failure并发模式失败的问题
【发布时间】:2013-11-05 15:23:21
【问题描述】:
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

【问题讨论】:

  • 为什么要使用增量模式?对于现代机器来说,由于安全指向行为,这很少是一个好的选择。

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


【解决方案1】:

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

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

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

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

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

-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly

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

【讨论】:

  • 我还可以看到阈值存在一些问题,因为计算出的阈值为 1,最大值为 4,而且所需的幸存者大小 51445760 字节也小于 91404824 字节。那么你有什么建议来调整这个吗?
  • 年龄大小可能计算错误,JVM中存在开放错误bugs.openjdk.java.net/browse/JDK-8027363
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多