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