【发布时间】:2016-09-13 13:44:27
【问题描述】:
我们使用 WildFly 8.2.1 和 Java 1.8_92 运行的 Java 应用程序在巨大的负载下完全挂起。这种情况下的线程转储显示,在监视器 0x00000005cc562228 处有很多线程处于 WAITING 状态:
"default task-100" #825 prio=5 os_prio=0 tid=0x00000000033a2800 nid=0x49bd in Object.wait() [0x00007f238cb98000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1465)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
- locked <0x00000005cc562228> (a com.mchange.v2.resourcepool.BasicResourcePool)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
.......
我们如何才能找到这个监视器锁的所有者,因为我们假设这个线程是一些连接泄漏的原因?我们假设此监视器锁出现在另一个上下文中,但事实并非如此。
或者对于死锁情况可能有任何其他提示?非常感谢任何帮助,因为我们在这个问题上苦苦挣扎了很长时间。
【问题讨论】:
-
它挂起的原因不是那些线程等待锁变得可用,它们等待调用 notify(All) 的东西以及可能拥有池中的资源的东西(或忘记通知)。如果锁被阻止,您会看到类似“等待监视器进入”的内容(例如在 stackoverflow.com/a/11343043 中)。
标签: java multithreading wildfly connection-leaks