線程的幾種狀態(tài)及狀態(tài)之間的轉(zhuǎn)換下面這張圖描述的很清晰:

線程狀態(tài)轉(zhuǎn)換(圖片來源于網(wǎng)絡(luò))
另外推薦大家一篇文章,這篇文章寫的非常不錯,有興趣的也可以關(guān)注下他的公眾號:hollischuang
Java命令學習系列(二)——Jstack
下面說下如何根據(jù)stack dump分析系統(tǒng)問題:
1)找到應(yīng)用的pid,命令:ps -ef | grep <keyword>
示例:ps -ef | grep tomcat

2)打印stack dump到本地,命令:jstack -l <pid> > <filename>
示例:jstack -l 15469 >jstack.log

3)通過pid,找到該進程下所有的線程信息,命令:top -Hp <pid>
示例:top -Hp 15469

4)觀察第三步界面上的進程信息,隨便挑選一個pid,然后將這個pid轉(zhuǎn)成16進制的??梢栽陔娔X上打開計算機->程序員 選擇十進制,輸入pid,然后在選擇十六進制,換算成十六進制:

5)打開第二步打印的stack dump,檢索第四步中的十六進制pid(所有大寫變小寫),命令less,grep:

6)到此就能把服務(wù)器上看到的進程id和線程dump的信息映射起來了,剩下的就需要我們對線程自身的了解、對自己應(yīng)用的了解以及JVM的GC線程等等。
觀察線程的運行情況,比如某一個線程占中CPU很高,那可能就有死鎖了。通過stock dump的分析還可以看出線程是不是卡死在某些外部資源上了。
下次碰到實際的問題時再補充下根據(jù)stack dump找到問題原因的例子……