我有以下问题:
我在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进行线程转储。。。