线程的几种状态及状态之间的转换下面这张图描述的很清晰:
另外推荐大家一篇文章,这篇文章写的非常不错,有兴趣的也可以关注下他的公众号:hollischuang
Java命令学习系列(二)——Jstack
下面说下如何根据stack dump分析系统问题:
1)找到应用的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转成16进制的。可以在电脑上打开计算机->程序员 选择十进制,输入pid,然后在选择十六进制,换算成十六进制:
5)打开第二步打印的stack dump,检索第四步中的十六进制pid(所有大写变小写),命令less,grep:
6)到此就能把服务器上看到的进程id和线程dump的信息映射起来了,剩下的就需要我们对线程自身的了解、对自己应用的了解以及JVM的GC线程等等。
观察线程的运行情况,比如某一个线程占中CPU很高,那可能就有死锁了。通过stock dump的分析还可以看出线程是不是卡死在某些外部资源上了。
下次碰到实际的问题时再补充下根据stack dump找到问题原因的例子……