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重新启动.
任何人都可以告诉我这里发生了什么,可能导致本机方法阻止的原因是什么?每个卡住线程顶部的监视器入口地址范围不同.我怎么能弄清楚拿着这台显示器的是什么?
任何建议或意见将不胜感激!
谢谢,大卫
我最初的怀疑是您正在经历某种类加载器相关的死锁。我想,类加载需要在某种程度上同步,因为类信息将对整个虚拟机可用,而不仅仅是最初加载它的线程。
堆栈顶部的方法是本机方法这一事实似乎纯粹是巧合,因为部分类加载机制恰好是以这种方式实现的。
我会进一步调查类加载方面发生了什么。也许某些线程使用类加载器从速度慢/不可用的网络位置加载类,因此会阻塞很长时间,而不会将监视器交给想要加载类的其他线程。研究使用 -verbose:class 启动 JVM 时的输出可能是值得尝试的一件事。
也许你应该使用另一个jdk版本。
对于您的“令人困惑的问题”,1.5.0_08 有一个错误条目。报告内存泄漏(我不知道这是否与您的问题有关):
https://bugs.java.com/bugdatabase/view_bug ?bug_id=6469701
您还可以获取源代码并查看第 1383 行发生了什么。另一方面,它可能只是原始错误发生后的堆栈转储。
| 归档时间: |
|
| 查看次数: |
5841 次 |
| 最近记录: |