2010-11-13 168 views
6

正常情況下,當我要求線程轉儲時,很容易解釋系統性能不佳的症狀;即通常我能夠看到許多線程顯然正在等待已經獲取但未被另一個人釋放的監視器上。Java線程正在等待鎖定不是(明顯)鎖定的對象

在這種情況下,我有很多線程正在等待顯示器(0x965ad100),但沒有一個顯示器首先顯示該顯示器。有問題的線程可以用這個簽名來識別:

等待鎖定< 0x965ad100>(一uk.gov.dti.og.fox.ConAgent)

我試着用搜索引擎這一點,而我似乎發現的所有內容都是討論鎖定的顯示器的帖子,沒有關於等待未鎖定的顯示器的內容。

線程轉儲全部:http://www.basson.at/docs/stackoverflow/thread_dump.txt

我希望這裏有人能解釋我所看到的,或者至少指向我在正確的方向。預先感謝您的回覆。

+0

BTW向下箭頭訪問啓用它,你最好先檢查一下什麼是線程9這樣做,是因爲它在等待它已經收購了相同的鎖(0x96560c48) – 2010-11-13 22:46:04

回答

1

當你的線程轉儲被執行時,線程剛剛釋放監視器是可能的(儘管不太可能)。從監視器被釋放到下一個線程獲取它之間可能會有一段短暫的時間。如果你沒有陷入真正的僵局,這可以解釋你所看到的。嘗試另一個線程轉儲並檢查一個。

更可能的是,有一個線程已經存在的地方,已經擁有顯示器。有時不明顯。你的堆棧跟蹤有一些「鎖定」行,列出了持有某些鎖的線程,但該列表不一定是完整的。例如,我懷疑通過JNI獲得的鎖沒有列出。

如果您可以用內置鎖來替換, java.util.concurrent.locks.ReentrantLock,那麼你可以暫停程序並附加一個調試器,找到你關心的鎖,然後使用getOwner方法找到鎖擁有者。

1

如果您使用的是Eclipse,則可以通過Debug視圖使用內置的鎖定查看器,這可能會有幫助。您可以使用下拉菜單通過工具欄:)

alt text