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

标签 java multithreading wildfly connection-leaks

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

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

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

最佳答案

实际上这是拥有对应于default task-100的锁的线程(0x00000005cc562228)如您所见,感谢- locked <0x00000005cc562228>在线程的调用堆栈中。

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

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

关于java - 如何在 Java 中识别监视器锁的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276443/

相关文章:

java - 此代码为 Integer.parseInt(data[2]) 行抛出异常

java - 是否可以从 JRuby 创建 Java 类并在 Java 中使用它们?

Java byte[] 返回相同的字符串,即使 byte[] 数组被更改为添加一些填充

javascript - 证明 Javascript 中不可能有 sleep 功能?

python - 并行打印和写锁

java - 倒计时器根本不工作

wildfly - 在 Keycloak 中测试/调试 javascript 映射器/策略的最佳方法

ip-address - 如何更改 Wildfly 服务器的 IP 地址

java - 是内存泄漏吗?

java - Eclipse 中的 Wildfly 不使用standalone.conf 中设置的堆参数