如何将介绍几种获取ThreadDump的方法,以及ThreadDump的分析工具。
1)在Java程序的运行会话中,使用下面方式:
Unix、Linux:CTRL-\
Windows:CTRL-BREAK
2) 方式1)要求是在Java程序的会话中才可以,如果不是在Java程序的会话中,如何做呢?
使用Jdk中提供Jstack工具,即jstack pid,这个不论Windows还是Linux都是可以的。如果不想使用这个工具或者没有安装这个工具,还可以使用下面的命令:
Linux:kill -3 pid
Windows:SendSignal.exe pid
需要说明的是:kill -3 pid 是Linux中的Shell程序,而Windows中使用的SendSignal.exe是一位名为Louis的牛人写的一个工具,其实就是模拟了CTRL-BREAK。
3)有时候,你可能没有进程的访问权限,例如的Linux中多用户情况下,要获取ThreadDump怎么办呢?
只能通过写Java程序获取了,提示一点,可以使用JMX来完成。
java.lang域下有一个Threading#dumpAllThreads(boolean, boolean)方法,通过这个方法就可以直接拿到ThreadDump信息。
4)如果你是想要看看你的应用程序为何吃内存特别厉害,或者频繁卡死等等不正常现象,要想找出原因的话,你也可以使用jconsole、jvisualvm、jprofile 来获取ThreadDump以及HeapDump,并加以分析。当然了,如果你是一个Java Developer,你也可以使用Eclipse提供的Memory Analyzer Tool (MAT)来替代这些工具。
另外,还有一个工具:ThreadDumpViewer,这个工具比较少见,也是一个免费的用于分析ThreadDump的工具。这里也它的下载地址。
5)如果你是开发服务器应用程序、或者其他的运维相关的应用程序,要给大家提供查看ThreadDump信息时,肯定是要通过程序来控制了,此时就比较灵活了:
A:可以使用3)的方式
B:也可以使用Java Runtime API执行命令的方式执行上面2)中提到的那些命令来完成。