如何在Java中识别监视器锁的所有者

时间:2016-05-17 12:37:42

标签: java multithreading wildfly connection-leaks

我们使用WildFly 8.2.1和Java 1.8_92运行的Java应用程序完全挂起了巨大的负载。在这种情况下,一个threaddump显示很多线程处于监视器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)
    .......

我们如何找到此监视器锁的所有者,因为我们假设此线程是某些连接泄漏的原因?我们假设此监视器锁定出现在另一个上下文中,但事实并非如此。

或者可能还有其他暗示死锁的情况?任何帮助都非常感激,因为我们在这个问题上遇到了很长时间。

1 个答案:

答案 0 :(得分:2)

实际上这是拥有与default task-100对应的锁的线程(0x00000005cc562228),正如您在线程的调用堆栈中看到- locked <0x00000005cc562228>所看到的那样。

如果您使用JConsole之类的工具,则可以在Threads标签中通过“Detect Deadlock”按钮检测死锁。

但是在您的情况下,它似乎不是死锁,因为锁的所有者显然等待来自对象池的Object的可用性。我猜这是一个连接池,所以你应该增加连接池的最大大小,以避免这种问题。