如何调试挂起的java线程?

时间:2012-07-10 05:55:34

标签: java multithreading debugging tomcat

我有以下问题:
我在Tomcat(Linux)中部署Web应用程序,在关闭Tomcat之后,如果我ps -ef我仍然可以看到java进程正在运行。
我相信这是由于一些悬挂线程而发生但我不知道如何跟踪这个线程 我该如何调试此问题?

2 个答案:

答案 0 :(得分:5)

您可以按照以下说明生成4-5个线程转储,然后使用Samurai等工具对其进行分析。

您要检查的是当发生卡住线程或长时间运行的事务时,所有线程转储都会显示某个线程ID在您的Java堆栈跟踪中的同一行。简单来说,事务跨越多个线程转储,因此需要更多的调查。

现在,当您通过Samurai运行这些内容时,它会以红色突出显示这些内容,以便您可以快速点击它并转到显示问题的行。

查看此here的示例。查看该链接中的Samurai输出图像。绿色细胞很好。红色和灰色细胞需要看。

生成线程转储:

(适用Linux)的

如果JVM在控制台中运行,则只需按Ctrl-\即可。 如果JVM在后台运行,则向其发送QUIT信号:

kill -QUIT process_id

process_id是正在运行的Java进程的进程号。线程转储将被发送到重定向标准输出的任何地方。 您通常可以使用以下命令获取所有正在运行的Java进程的进程号:

ps axf | grep java

答案 1 :(得分:2)

你说你的java进程仍然存在,对吗? 只要有连接线程就存在进程,对吧? 如果是这样,我会采取以下方法:   - 使用JVM

内部附加和管理的MBean服务器运行该进程

然后在发送QUIT信号并获得线程转储后连接到进程(应该有一个JMX。看看哪些线程看起来很可疑。

我认为你也可以使用JVisualVM来进行线程转储......