Windows如何使用jstack跟蹤異常代碼

主要使用了jps和jstack命令及procexp.exe工具

Jps常用命令整理

Jps(Java Virtual MachineProcess Status Tool)是JDK 1.5提供的一個顯示當前所有Java進程pid命令

1、 jps :列出pid和Java主類名

2、 jps -l:列出pid和Java主類全稱

3、 jps -lm:列出PID、主類全稱和應用程序參數

4、 jps –v:列出pid和JVM參數

JStack常用命令整理

Jstack是Java虛擬機自帶的一種堆棧跟蹤工具。Jstack用於打印出給定的Java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項」-J-d64」,Windows的jstack使用方式只支持以下的這種方式

Jstack [–l] pid 

主要分爲兩個功能: 

a  針對活着的進程做本地的或遠程的線程dump 

b  針對core文件做線程dump

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做什麼事情,或者等待什麼資源。如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stacknative stack的信息,從而可以輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的javastack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。

線程狀態

想要通過jstack命令來分析線程的情況的話,首先要知道線程都有哪些狀態,下面這些狀態是我們使用jstack命令查看線程堆棧信息時可能會看到的線程的幾種狀態:

NEW,未啓動的。不會出現在Dump中。

RUNNABLE,在虛擬機內執行的。運行中狀態,可能裏面還能看到locked字樣,表明它獲得了某把鎖。

BLOCKED,受阻塞並等待監視器鎖。被某個鎖(synchronizers)block住了。

WATING,無限期等待另一個線程執行特定操作。等待某個conditionmonitor發生,一般停留在park(), wait(), sleep(),join() 等語句裏。

TIMED_WATING,有時限的等待另一個線程的特定操作。和WAITING的區別是wait() 等語句加上了時間限制 wait(timeout)

TERMINATED,已退出的。

Procexp.exe工具

ProcessExplorer(procexp)是一款進程監視工具,網上百度吧。

其他的不說了:

案例:執行,死循環

第一步:怎樣找到進程ID(PID),PID爲13616


第二步:怎樣用jstack輸出線程快照日誌,存放到d盤的log.txt

第三步:怎樣用procexp.exe工具快速定位線程ID,並跟蹤,切換十進制轉換成十六進制


第四步:打開log.txt文件,搜索1A60,跟舉例的代碼對應上

ok,完事了。