gpt4 book ai didi

java - 多个线程卡在 native 调用中(Java)

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:27 24 4
gpt4 key购买 nike

我在使用 JDK 1.5.0_08 的 Fedora Core 6 上运行的应用程序出现问题。

经过一定时间(通常是几天)后,线程开始卡在本地方法中。

线程被锁定在这样的地方:

"pool-2-thread-2571" prio=1 tid=0x08dd0b28 nid=0x319e waiting for monitor entry [0xb91fe000..0xb91ff7d4]
at java.lang.Class.getDeclaredConstructors0(Native Method)

"pool-2-thread-2547" prio=1 tid=0x75641620 nid=0x1745 waiting for monitor entry [0xbc7fe000..0xbc7ff554]
at sun.misc.Unsafe.defineClass(Native Method)

让我特别困惑的是这个:

"HealthMonitor-10" daemon prio=1 tid=0x0868d1c0 nid=0x2b72 waiting for monitor entry [0xbe5ff000..0xbe5ff4d4]
at java.lang.Thread.dumpThreads(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1383)

线程会一直卡住,直到虚拟机重新启动。

谁能告诉我这里发生了什么,什么可能导致 native 方法阻塞?每个卡住的线程顶部的监控入口地址范围是不同的。我怎样才能弄清楚是什么支撑着这台显示器?

最佳答案

我最初的怀疑是您遇到了某种类加载器相关的死锁。我想,类加载需要在某种程度上同步,因为类信息将对整个 VM 可用,而不仅仅是最初加载它的线程。

堆栈顶部的方法是本地方法这一事实似乎纯属巧合,因为部分类加载机制恰好以这种方式实现。

我会进一步调查类加载方面的情况。也许某些线程使用类加载器从速度慢/不可用的网络位置加载类,因此会阻塞很长时间,而不会将监视器交给其他想要加载类的线程。在使用 -verbose:class 启动 JVM 时调查输出可能是一回事。

关于java - 多个线程卡在 native 调用中(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com