线程dump的工具和方法

              线程dump的工具和方法

 

 

       在Java项目中,有很多时候需要做线程dump,比如,系统挂起、死锁、不能创建更多本地线程的OOME、CPU消耗过多等等;甚至有些堆内存溢出也可能跟线程有关,因为可能是创建了过多的线程导致堆内存不够用。

       这里主要来说说做线程dump的一些方法和使用场合,至于如何做线程分析,将会在下一篇文字中说到。

       本文所提到的工具,都是Java平台本身提供的工具或者一些开源的工具,这样的工具,大家都可以自由的使用。而一些商业工具,如JProfiler、YourKit、JProbe等,将不会被提及。

1.       VisualVM

这是Java平台本身提供的性能分析工具,它使用于系统还在正常运行,VisualVM客户端还能连接上去的时候。

下面就是一个线程监控界面:


你可以在界面上实时观察线程变化情况,比如,某个线程启动过多的话,直接数线程数目就可以看出来。

做线程dump,请点击最右边的“Thread Dump”按钮即可,工具会告诉你dump文件保存的位置。

值得注意的是,使用VisualVM连接远程服务器时,远程服务器将JMX服务器开启,并知道该JMX服务器的IP和端口,甚至用户名和密码,才能使用VisualVM连接上远程服务器。

 

2.       jstack

这也是Java平台提供的线程dump工具。

前面说了,VisualVM需要被分析系统在正常运行的时候,才能连接上去。

而jstack除了在正常运行的系统能连接上去以外,在系统已经不能正常提供JMX服务了,但进程还活着的时候,也能连接上去。

使用jstack命令的帮助可以看到,该工具的功能也很强大:


主要分为两个功能:

a.  针对活着的进程做本地的或远程的线程dump;

b.  针对core文件做线程dump。

比如,下面就是一个针对进程做的线程dump:


jstack除了进程活着的时候可以做dump,如果进程crash了,那么系统应该会留下core文件,jstack工具依然能够对core文件做线程dump,如下所示:


值得注意的是,虽然jstack功能很强大,但它只能做线程dump,没有VisualVM那么强大的线程监控能力。

所以,我们第一使用的仍然是VisualVM。

 

3.       gdb

最后一个工具,是linux平台的。

当对使用jstack对core文件做线程dump时,却报错了,得不到任何的dump信息时,可以用它。

它的用法是:

gdb <executable> <core>

其中,executable指的是java所在的目录,如:

D:\Program Files\Java\jdk1.7.0_10\bin

上面的是windows环境下的java命令路径,请对应到linux环境下的改路径。

展开阅读全文

没有更多推荐了,返回首页