1. 查找 java進程
ps -ef|grep java
2. 查找耗時最高線程
top -Hp #進程id#
3. 將線程id轉(zhuǎn)換為16進制
printf “%x\n” #線程id#
4. 使用stack查找相應(yīng)線程棧信息
jstack -l #進程id#| grep #16進制線程id#
5. 開始分析線程堆棧
先復(fù)習(xí)一下線程的各種狀態(tài)空厌, 包括 NEW(新建)瀑踢, Runnable(可運行), Running(運行) ,Block(阻塞)趣兄, Dead(死亡) 其中阻塞還分為 等待阻塞、同步阻塞。
轉(zhuǎn)換關(guān)系如下圖:
(圖片來自 https://my.oschina.net/mingdongcheng/blog/139263)
接下來看一下jstack打出來的線程堆棧,大概是這樣的:
"Timer-0" #25 daemon prio=5 os_prio=31 tid=0x00007fd051bb1800 nid=0xfabb in Object.wait() [0x0000700008e90000]
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 <0x00000007a22af328> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)
Locked ownable synchronizers:
- None
需要重點關(guān)注有沒有以下幾個狀態(tài):
- DeadLock 死鎖
- Waiting on Condition 資源等待
- Blocked 阻塞
具體的case分析可以參考這篇文章 Java線程Dump分析工具—jstack - 殘雪余香 - 博客園