通常当我要求进行线程转储时,很容易解释系统性能不佳的症状;即通常情况下,我可以看到许多线程正在等待已经获得但未被其他人释放的监视器上。
在这种情况下,我有很多线程正在等待监视器(0x965ad100),但是没有一个线程首先拥有该监视器。可以使用此签名识别有问题的线程:
等待锁定< 0x965ad100> (a uk.gov.dti.og.fox.ConAgent)
我已经尝试了谷歌搜索,我似乎找到的所有内容都是讨论被锁定的显示器,而不是等待未锁定的显示器。
完整的线程转储:http://www.basson.at/docs/stackoverflow/thread_dump.txt
我希望这里有人可以解释我所看到的,或者至少指出我正确的方向。提前感谢任何回复。
答案 0 :(得分:1)
在进行线程转储时,线程可能(虽然不太可能)刚刚释放了监视器。从监视器发布到下一个线程获取监视器之间可能会有一段短暂的时间。如果你没有陷入实际的僵局,这可以解释你所看到的。尝试另一个线程转储并检查一个。
更有可能的是,那里有一个线程已经存放了监视器。有时它并不明显。您的堆栈跟踪有一些“锁定”行,列出了包含某些锁的线程,但该列表不一定完整。例如,我怀疑未通过JNI获得锁定。
如果您可以更换内置锁,例如java.util.concurrent.locks.ReentrantLock
,然后您可以暂停程序并附加调试器,找到您关心的锁,并使用getOwner
方法找到锁所有者。
答案 1 :(得分:1)
如果您正在使用Eclipse,则可以通过Debug视图使用内置锁定查看器,这可能会有所帮助。您可以使用工具栏中向下箭头访问的下拉菜单启用它:)