Java“魔法”-jstack命令解析
怕什么真理無窮
進一步有近一步的歡喜
jstack命令主要用來查看Java線程的調用堆棧的,可以用來分析線程問題(如死鎖)。
命令說明
官網(wǎng)文檔地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html
Usage:
jstack [-l] <pid>
(to connect to running process) 連接活動線程
jstack -F [-m] [-l] <pid>
(to connect to a hung process) 連接阻塞線程
jstack [-m] [-l] <executable> <core>
(to connect to a core file) 連接dump的文件
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server) 連接遠程服務器
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
在使用jstack之前需要先大概知道線程的狀態(tài)相關的知識,下面為你準備好了。
線程狀態(tài)
線程在運行的過程中,會在幾種狀態(tài)中進行切換,我們可以用jstack命令查看線程堆棧信息時,可能會看到的線程的幾種狀態(tài),了解這些線程的狀態(tài),方便后續(xù)對于具體問題的排查和解決。
NEW :未啟動的。不會出現(xiàn)在Dump中 RUNNABLE :在虛擬機中準備執(zhí)行的 BLOCKED :阻塞并等待監(jiān)視器鎖 WATING :無限期等待另一個線程執(zhí)行特定操作 TIMED_WATING :有時限的等待另一個線程的特定操作 TERMINATED :已退出的,線程終止
jstack輸出日志
知道要查詢應用的PId,就可以使用jstack 輸出線程的信息。
# 輸出結果
jstack -l pid
#輸出結果到日志中
jstack -l pid > /tmp/jstack.log
大致信息如下:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):
"Attach Listener" #50173 daemon prio=9 os_prio=0 tid=0x00007f4ba401a800 nid=0x69ab waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Pinpoint-Grpc-ActiveThreadCountService-Timer" #12474 daemon prio=5 os_prio=0 tid=0x00007f4b54051000 nid=0x292b in Object.wait() [0x00007f4bd067f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at java.util.TimerThread.mainLoop(Timer.java:526)
- locked <0x00000000f065d3f0> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)
Locked ownable synchronizers:
- None
使用的技巧
jstack檢測死鎖
Found one Java-level deadlock:
.... 省略信息
Found 1 deadlock
jstack統(tǒng)計線程數(shù)
jstack -l pid | grep 'java.lang.Thread.State' | wc -l
jstack檢測cpu占用高
1、查看cpu占用高進程 2、查看cpu占用高線程 2、轉換線程ID 4、定位cpu占用線程 5、分析原因和解決
具體的詳細步驟可以參考我之前寫的這篇文章:體驗了一把線上CPU100%及應用OOM的排查和解決過程
評論
圖片
表情




