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