3

我们使用 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)
    .......

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

或者对于僵局情况可能有任何其他提示?非常感谢任何帮助,因为我们在这个问题上挣扎了很长时间。

4

1 回答 1

2

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

如果您使用类似的工具JConsole,在Threads选项卡中您可以通过按钮“”检测死锁Detect Deadlock

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

于 2016-05-17T12:42:11.553 回答