1. 程式人生 > 其它 >jstack跟蹤Java堆疊資訊

jstack跟蹤Java堆疊資訊

1、簡介

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

2、jstack命令引數

命令語法:

jstack [options] pid

命令引數說明:

option:jstack命令的可選引數。如果沒有指定這個引數,jstack命令會顯示Java虛擬機器當前時刻的執行緒快照資訊,如下圖

-F引數

如果Java虛擬機器程序由於程序掛起而沒有任何響應,那麼可以使用-F引數(僅在Oracle Solaris和Linux作業系統上游戲)強制顯示執行緒快照資訊。

-l引數

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

-m引數

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

3、jstack 分析 CPU 問題

top -Hp pid來找到 CPU 使用率比較高的一些執行緒

將排在前面的執行緒 PID 轉換成十六進位制

printf ‘%x\n’ pid得到 nid

列印 Java 執行緒棧的資訊

jstack pid |grep ‘nid’ -C5 –color

jstack 24076| grep 5e0d -A30
  • 2838:java 程序
  • 12c8:執行緒十六進位制
  • -A30:列印 30 行
  • 包含:包名、類名、程式碼行資訊,可以快速定位到某行程式碼導致該執行緒 CPU 使用率過高
  • jstack:JDK 自帶命令

當然更常見的是我們對整個 jstack 檔案進行分析,通常我們會比較關注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用說了。我們可以使用命令

cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c