如何调试挂起的java线程



我有以下问题:
我在Tomcat(Linux)中部署了一个web应用程序,在Tomcat关闭后,如果我执行ps -ef,我仍然可以看到java进程正在运行
我相信这是由于一些挂线造成的,但我不知道如何才能找到这个线索
如何调试此问题?

您可以生成4-5个线程转储,如下所述,然后使用Samurai等工具进行分析。

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

现在,当你在Samurai中运行这些时,它会以红色突出显示这些内容,这样你就可以快速点击它,进入显示问题的行。

请参阅此处的示例。看看链接中的武士输出图像。绿色细胞很好。红细胞和灰细胞需要观察。

生成线程转储:

(Linux)

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

kill -QUIT process_id

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

ps axf | grep java

你说你的java进程仍然存在,对吧?进程只要有附加的线程就存在,对吧?如果是这样的话,我会采取以下方法:-在连接MBean服务器并由JVM 内部管理的情况下运行进程

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

我认为您还可以使用JVisualVM进行线程转储。。。

最新更新