jstack命令簡介
jstack(Java Virtual Machine Stack Trace)是JDK提供的一個可以生成Java虛擬機器當前時刻的執行緒快照資訊的命令列工具。執行緒快照一般被稱為threaddump或者javacore檔案,是當前Java虛擬機器中每個執行緒正在執行的Java執行緒、虛擬機器內部執行緒和可選的本地方法堆疊幀的集合。對於每個方法棧幀,將會顯示完整的類名、方法名、位元組碼索引(bytecode index,BCI)和行號。生成的執行緒快照可以用於定位執行緒出現長時間停頓的原因,比如:執行緒間死鎖、死迴圈、請求外部資源被長時間掛起等等。
jstack命令引數
命令語法:
jstack [options] pid
命令引數說明:
option
:jstack命令的可選引數。如果沒有指定這個引數,jstack命令會顯示Java虛擬機器當前時刻的執行緒快照資訊,如下圖:
pid
:要列印配置資訊的Java虛擬機器的程式ID。
想要要獲取執行的Java虛擬機器程式的列表,可以使用ps命令(Linux系統中)或tasklist命令(Windows系統中),如果Java虛擬機器程式沒有在單獨的docker例項中執行,可以使用jps命令。
option
都有哪些引數呢?我們來看一下。
-F引數
如果Java虛擬機器程式由於程式掛起而沒有任何響應,那麼可以使用-F
引數(僅在Oracle Solaris和Linux作業系統上游戲)強制顯示執行緒快照資訊。
比如:
-l引數
如果使用-l
引數,除了方法棧幀以外,jstack命令還會顯示關於鎖的附加資訊,比如屬於java.util.concurrent的ownable synchronizers列表。
比如:
-m引數
如果使用-m
引數,jstack命令將顯示混合的棧幀資訊,除了Java方法棧幀以外,還有本地方法棧幀。本地方法棧幀是C或C++編寫的虛擬機器程式碼或JNI/native程式碼。
比如:
在顯示結果中,以星號為字首的幀是Java方法棧幀,而不以星號為字首的是本地方法棧幀。比如:
-h 和 -help
顯示jstack命令的幫助資訊。
結尾
雖然jstack命令已經推出很久並且使用頻率比較搞,但它仍然是一個“實驗性質的,並且沒有技術支援的”(Experimental and Unsupported)工具,日後可能會被轉正,也有可能在某個JDK版本中無聲無息地消失。所以,且用且珍惜吧。
不過,我們還可以使用Thread.getAllStackTracesgetAll()方法,獲取Java虛擬機器中所有執行緒的StackTraceElement
物件,進而獲得所有執行緒棧幀資訊。
最後,謝謝你這麼帥,還給我點贊和關注。
微信公眾號:萬貓學社
微信掃描二維碼
關注後回覆「電子書」
獲取12本Java必讀技術書籍