线程状态及stack dump分析

线程的几种状态及状态之间的转换下面这张图描述的很清晰:


线程状态及stack dump分析_第1张图片
线程状态转换(图片来源于网络)

另外推荐大家一篇文章,这篇文章写的非常不错,有兴趣的也可以关注下他的公众号:hollischuang
Java命令学习系列(二)——Jstack

下面说下如何根据stack dump分析系统问题:
1)找到应用的pid,命令:ps -ef | grep
示例:ps -ef | grep tomcat


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


线程状态及stack dump分析_第2张图片

3)通过pid,找到该进程下所有的线程信息,命令:top -Hp
示例:top -Hp 15469

线程状态及stack dump分析_第3张图片

4)观察第三步界面上的进程信息,随便挑选一个pid,然后将这个pid转成16进制的。可以在电脑上打开计算机->程序员 选择十进制,输入pid,然后在选择十六进制,换算成十六进制:

线程状态及stack dump分析_第4张图片

5)打开第二步打印的stack dump,检索第四步中的十六进制pid(所有大写变小写),命令less,grep:

线程状态及stack dump分析_第5张图片

6)到此就能把服务器上看到的进程id和线程dump的信息映射起来了,剩下的就需要我们对线程自身的了解、对自己应用的了解以及JVM的GC线程等等。
观察线程的运行情况,比如某一个线程占中CPU很高,那可能就有死锁了。通过stock dump的分析还可以看出线程是不是卡死在某些外部资源上了。

下次碰到实际的问题时再补充下根据stack dump找到问题原因的例子……

你可能感兴趣的:(线程状态及stack dump分析)