線程的幾種狀態(tài)及狀態(tài)之間的轉(zhuǎn)換下面這張圖描述的很清晰:
另外推薦大家一篇文章吻氧,這篇文章寫(xiě)的非常不錯(cuò)鬼吵,有興趣的也可以關(guān)注下他的公眾號(hào):hollischuang
Java命令學(xué)習(xí)系列(二)——Jstack
下面說(shuō)下如何根據(jù)stack dump分析系統(tǒng)問(wèn)題:
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)通過(guò)pid鸠真,找到該進(jìn)程下所有的線程信息,命令:top -Hp <pid>
示例:top -Hp 15469
4)觀察第三步界面上的進(jìn)程信息,隨便挑選一個(gè)pid宪拥,然后將這個(gè)pid轉(zhuǎn)成16進(jìn)制的扁位。可以在電腦上打開(kāi)計(jì)算機(jī)->程序員 選擇十進(jìn)制者铜,輸入pid腔丧,然后在選擇十六進(jìn)制,換算成十六進(jìn)制:
5)打開(kāi)第二步打印的stack dump作烟,檢索第四步中的十六進(jìn)制pid(所有大寫(xiě)變小寫(xiě))愉粤,命令less,grep:
6)到此就能把服務(wù)器上看到的進(jìn)程id和線程dump的信息映射起來(lái)了拿撩,剩下的就需要我們對(duì)線程自身的了解衣厘、對(duì)自己應(yīng)用的了解以及JVM的GC線程等等。
觀察線程的運(yùn)行情況压恒,比如某一個(gè)線程占中CPU很高头滔,那可能就有死鎖了怖亭。通過(guò)stock dump的分析還可以看出線程是不是卡死在某些外部資源上了。
下次碰到實(shí)際的問(wèn)題時(shí)再補(bǔ)充下根據(jù)stack dump找到問(wèn)題原因的例子……