【问题标题】:EhCache Weblogic Deadlock?EhCache Weblogic 死锁?
【发布时间】:2012-12-14 23:15:15
【问题描述】:

有一个 webservice 客户端使用 ehcache 来缓存一些结果并避免过多的 ws 调用。

显然,调用此 ws 客户端的服务器(在 Weblogic OSB 上)只是挂起,甚至没有在日志中写入任何内容……只是冻结!只要有一点流量就可以了。

完整的线程转储在这里:

http://pastebin.com/rdVyxjNc

下面是我不太清楚的停车等待

但我无法在线程转储中找到对 0x8a03c9c0 的任何引用。

您是否在线程转储中看到任何可能导致此服务器冻结的内容?

谢谢

searchByTemplate.data" prio=3 tid=0x0115b400 nid=0x5e waiting on condition [0x5ef7f000..0x5ef7fbf0]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x8a03c9c0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1963)
        at java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
        ...

【问题讨论】:

    标签: java weblogic solaris deadlock ehcache


    【解决方案1】:

    您突出显示的线程实际上“可用于”处理请求,因此不是问题。 Weblogic Oracle Service Bus 依赖 XQuery 进行 XML 操作。众所周知,XQuery 在处理大数据负载时会占用大量 CPU 和内存。

    我刚刚分析了您的线程转储。线程转储清楚地显示了高 CPU 模式,其中多个线程正在执行诸如解析 XML 和尝试在某些数据结构(如 ArrayList 等)中分配内存。

    我怀疑“挂起”问题的根源可能有两种情况:

    过多的垃圾收集和 OldGen 空间耗尽

    HotSpot JVM 1.6+ 在底部包含 Java 堆利用率。我们可以看到 OldGen 空间在 92%。这重新强化了我们从线程转储中看到的线程模式。

    1. PSYoungGen 总计 466944K,已使用 233472K [0xd1000000, 0xfbc00000, 0xfbc00000)
    2. eden 空间 233472K,已使用 100% [0xd1000000,0xdf400000,0xdf400000)
    3. 从空间 233472K,使用 0% [0xed800000,0xed800000,0xfbc00000)
    4. 到空间 233472K,0% 已使用 [0xdf400000,0xdf400000,0xed800000)
    5. ParOldGen 总计 1400832K,使用了 1297110K [0x7b800000, 0xd1000000, 0xd1000000)
    6. 对象空间 1400832K,92%已使用 [0x7b800000,0xcaab5ac8,0xd1000000)
    7. PSPermGen 总计 262144K,已使用 167570K [0x6b800000, 0x7b800000, 0x7b800000)
    8. 对象空间 262144K,已使用 63% [0x6b800000,0x75ba4ab0,0x7b800000)

    消耗 CPU 和/或 Java 堆内存的罪魁祸首线程

    在这种情况下,一个或几个线程可能会参与不间断处理,例如不返回 XQuery 等,从而导致 CPU 激增和 JVM 争用。

    现在在下面找到我的建议:

    • 启用详细:gc。这将允许您根据垃圾收集频率对 Java 堆进行运行状况和足迹评估
    • 下次看到问题时,执行每个线程的 CPU% 分析。这将允许您确定您是否正在处理消耗 CPU 和/或 Java 堆内存的特定服务总线请求

    从我的博客中查找以下文章,以帮助您进行下一个分析阶段:

    详细的 GC 分析

    JVM Verbose GC tutorial

    Java 高 CPU 故障排除

    Java High CPU troubleshooting

    问候, P-H

    【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多