我們有一個junit測試跑步者,如果一次測試掛起,超時。現在我想通過API創建一個線程轉儲。如何查看哪個監視器是通過API等待的線程?
我知道我可以通過Thread.getAllStackTraces()請求堆棧跟蹤。但是控制檯上的線程轉儲包含更多信息,例如線程正在等待的監視器。
是否有一個API來請求線程正在等待的監視器?
我們有一個junit測試跑步者,如果一次測試掛起,超時。現在我想通過API創建一個線程轉儲。如何查看哪個監視器是通過API等待的線程?
我知道我可以通過Thread.getAllStackTraces()請求堆棧跟蹤。但是控制檯上的線程轉儲包含更多信息,例如線程正在等待的監視器。
是否有一個API來請求線程正在等待的監視器?
您可以使用JMX創建線程轉儲。
查看How do I create a thread dump via JMX?舉例。 ThreadInfo類支持獲取鎖定的監視器。
JDK 6文檔包含有關JVM MBean的程序化監視的一節。 我從來沒有使用過它們,也無法提供示例代碼,但它肯定會給你一個開始。
Managing and monitoring programmatic way
The Attach API to connect to a remote JVM
我希望它能幫助,這將是非常有益的,如果你可以分享你的研究成果。
這對我來說還不清楚 - 你想以編程方式或手動方式嗎? – 2011-05-17 12:46:21
如果您生成所有堆棧跟蹤,您是否看不到線程正在等待的位置? – nsfyn55 2011-05-17 12:53:41
我認爲API很明確。我想以編程方式進行。如果發生超時,我想從測試服務器的日誌中寫入轉儲。測試服務器不應凍結它終止。手動是不可能的。 – Horcrux7 2011-05-17 13:19:15