通常,当我要求进行线程转储时,很容易解释性能不佳的系统的症状;即通常情况下,我可以看到许多线程显然正在等待已被另一个线程获取但未释放的监视器。
在本例中,我有很多线程在等待监视器 (0x965ad100),但似乎没有一个线程首先拥有该监视器。可以使用以下签名来识别有问题的线程:
等待锁定 (uk.gov.dti.og.fox.ConAgent)
我试过用谷歌搜索这个,我似乎找到的都是讨论锁定的监视器的帖子,没有关于等待未锁定的监视器的帖子。
完整的线程转储:http://www.basson.at/docs/stackoverflow/thread_dump.txt http://www.basson.at/docs/stackoverflow/thread_dump.txt
我希望这里有人可以解释我所看到的,或者至少为我指出正确的方向。预先感谢您的任何回复。
当线程转储被获取时,线程有可能(尽管不太可能)刚刚释放了监视器。释放监视器和下一个线程获取它之间可能有一个短暂的时间段。如果您没有真正陷入僵局,这可以解释您所看到的情况。尝试另一个线程转储并检查该线程转储。
更有可能的是,某个地方有一个线程已经持有监视器。有时并不明显。您的堆栈跟踪有一些“锁定”行,其中列出了持有某些锁的线程,但该列表不一定完整。例如,我怀疑通过 JNI 获取的锁未列出。
如果您可以将内置锁更换为,例如java.util.concurrent.locks.ReentrantLock
,然后您可以挂起程序并附加调试器,找到您关心的锁,并使用以下命令找到锁所有者getOwner
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)