Java的jstack命令使用詳解


jstack命令簡介

jstack(Java Virtual Machine Stack Trace)是JDK提供的一個可以生成Java虛擬機當前時刻的線程快照信息的命令行工具。線程快照一般被稱為threaddump或者javacore文件,是當前Java虛擬機中每個線程正在執行的Java線程、虛擬機內部線程和可選的本地方法堆棧幀的集合。對於每個方法棧幀,將會顯示完整的類名、方法名、字節碼索引(bytecode index,BCI)和行號。生成的線程快照可以用於定位線程出現長時間停頓的原因,比如:線程間死鎖、死循環、請求外部資源被長時間掛起等等。

jstack命令參數

命令語法:

jstack [options] pid

命令參數說明:

  • option:jstack命令的可選參數。如果沒有指定這個參數,jstack命令會顯示Java虛擬機當前時刻的線程快照信息,如下圖:

萬貓學社.png

  • pid:要打印配置信息的Java虛擬機的進程ID。

想要要獲取運行的Java虛擬機進程的列表,可以使用ps命令(Linux系統中)或tasklist命令(Windows系統中),如果Java虛擬機進程沒有在單獨的docker實例中運行,可以使用jps命令。

option都有哪些參數呢?我們來看一下。

-F參數

如果Java虛擬機進程由於進程掛起而沒有任何響應,那么可以使用-F參數(僅在Oracle Solaris和Linux操作系統上游戲)強制顯示線程快照信息。

比如:

萬貓學社.png

-l參數

如果使用-l參數,除了方法棧幀以外,jstack命令還會顯示關於鎖的附加信息,比如屬於java.util.concurrent的ownable synchronizers列表。

比如:

萬貓學社.png

-m參數

如果使用-m參數,jstack命令將顯示混合的棧幀信息,除了Java方法棧幀以外,還有本地方法棧幀。本地方法棧幀是C或C++編寫的虛擬機代碼或JNI/native代碼。

比如:

萬貓學社.png

在顯示結果中,以星號為前綴的幀是Java方法棧幀,而不以星號為前綴的是本地方法棧幀。比如:

萬貓學社.png

-h 和 -help

顯示jstack命令的幫助信息。

結尾

雖然jstack命令已經推出很久並且使用頻率比較搞,但它仍然是一個“實驗性質的,並且沒有技術支持的”(Experimental and Unsupported)工具,日后可能會被轉正,也有可能在某個JDK版本中無聲無息地消失。所以,且用且珍惜吧。

不過,我們還可以使用Thread.getAllStackTracesgetAll()方法,獲取Java虛擬機中所有線程的StackTraceElement對象,進而獲得所有線程棧幀信息。

最后,謝謝你這么帥,還給我點贊關注

微信公眾號:萬貓學社

微信掃描二維碼

關注后回復「電子書」

獲取12本Java必讀技術書籍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM