打破冷漠僵局文章_研究僵局–第2部分
打破冷漠僵局文章
調查死鎖時最重要的要求之一就是要研究死鎖。 在我的上一個博客中,我寫了一些名為DeadlockDemo代碼,該代碼使用一堆線程在一系列銀行賬戶之間轉移隨機數,然后陷入僵局。
該博客運行該代碼以演示獲取線程轉儲的幾種方法。 線程轉儲只是一個報告,顯示給定時間點所有應用程序線程的狀態。 這樣做的好處是,它包含各種信息,可讓您弄清為什么會出現死鎖,并希望可以解決此問題,但稍后會介紹更多。
殺死SIGQUIT
如果Java應用程序在UNIX計算機上運行,??則搶占線程轉儲的第一種方法(可能是最簡單的方法)是通過終端使用UNIX kill命令。
為此,請先使用ps和grep命令掌握應用程序的進程標識符或PID。 例如,如果您鍵入:
ps –e | grep java…然后您將生成一個類似于以下內容的列表:
74941 ttys000 0:00.01 grep java 70201 ttys004 1:00.89 /usr/bin/java threads.deadlock.DeadlockDemo在這種情況下, DeadlockDemo的PID是70201,它是從上面的輸出中獲取的。 請注意,不同類型的UNIX或不同的ps命令行參數可能會產生略有不同的結果,因此請檢查man頁。
掌握了PID之后,使用它發出kill SIGQUIT命令:
kill -3 70201kill命令是UNIX命令,用于處理不需要的進程
盡管上面的-3是SIGQUIT(等效于鍵盤ctrl-D)參數,但是如果Java收到此信號,它將不會退出,它將在其關聯的終端上顯示線程轉儲。 然后,您可以抓住它并將其復制到文本文件中以進行進一步分析。
jstack
如果您在Windows中工作,則UNIX命令行不可用。 為了解決此問題,Java附帶了一個執行kill等效功能的實用程序。 這稱為jstack ,在UNIX和Windows上均可用。 它的用法與上面演示的kill命令相同:
jstack <PID>在Windows中獲取PID是打開Windows任務管理器的問題。 任務管理器默認情況下不顯示PID,因此您需要通過使用view菜單選項并在“ 選擇列”對話框中選中 PID(過程標識符)選項來更新其設置。
接下來,只需檢查進程列表并找到合適的java.exe實例即可。
讀取java.exe的PID并將其用作jstack參數,如下所示:
jstack 3492命令完成后,您可以保留輸出并將其復制到文本文件中以進行進一步分析。
jVisualVM
jVisualVM是獲得線程轉儲的“ Rolls Royce”方法。 它是Oracle提供的工具,使您可以掌握有關Java VM的許多不同信息。 這包括堆轉儲,CPU使用率,內存配置文件等等。
在Windows上,jVisualVM的實際程序名稱是jvisualvm或jvisualvm.exe 。 運行后,您將看到以下內容:
要獲得線程轉儲,請在左側的應用程序面板中找到您的應用程序 ,然后右鍵單擊并選擇:“ Thread Dump”。
然后在jvisualvm的右側窗格中顯示一個線程轉儲,如下所示:
請注意,在連接到本地VM時,我多次看到jvisualvm掛起。 發生這種情況時,請確保將其代理設置設置為“ 無代理”
獲得了線程轉儲后,我的下一個博客現在將使用它來研究示例DeadlockDemo代碼出了什么問題。
有關更多信息,請參閱本系列中的其他博客 。
參考: 調查死鎖-第2部分:在Captain Debug的Blog博客上從我們的JCG合作伙伴 Roger Hughes 獲得線程轉儲 。
翻譯自: https://www.javacodegeeks.com/2012/10/investigating-deadlocks-part-2.html
打破冷漠僵局文章
總結
以上是生活随笔為你收集整理的打破冷漠僵局文章_研究僵局–第2部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: video 满屏显示_HTML5 vid
- 下一篇: 忘记密码情况下卸载诺顿杀毒软件的方法(未