多线程卡在本机调用中(Java)

Dav*_*ick 5 java multithreading native-methods blocked

我在使用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)
Run Code Online (Sandbox Code Playgroud)

要么

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

特别令我困惑的是这一个:

"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)
Run Code Online (Sandbox Code Playgroud)

线程保持卡住状态,直到VM重新启动.

任何人都可以告诉我这里发生了什么,可能导致本机方法阻止的原因是什么?每个卡住线程顶部的监视器入口地址范围不同.我怎么能弄清楚拿着这台显示器的是什么?

任何建议或意见将不胜感激!

谢谢,大卫

Voi*_*ter 5

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

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

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


Joh*_*ers 0

也许你应该使用另一个jdk版本。
对于您的“令人困惑的问题”,1.5.0_08 有一个错误条目。报告内存泄漏(我不知道这是否与您的问题有关):
https://bugs.java.com/bugdatabase/view_bug ?bug_id=6469701

您还可以获取源代码并查看第 1383 行发生了什么。另一方面,它可能只是原始错误发生后的堆栈转储。