我有以下问题:
我在 Tomcat (Linux) 中部署了一个 Web 应用程序,并且在关闭 Tomcat 之后,如果我这样做了,ps -ef
我仍然可以看到该java
进程正在运行。
我相信这是由于一些挂起的线程而发生的,但我不知道如何追踪这个线程。
我该如何调试这个问题?
2 回答
您可以生成 4-5 个线程转储,如下所述,然后使用Samurai等工具对其进行分析。
您要检查的是,当发生卡住线程或长时间运行的事务时,所有线程转储都会显示某个线程 id 在您的 java 堆栈跟踪中的同一行。简单来说,事务跨越多个线程转储,因此需要更多调查。
现在,当您通过Samurai运行这些内容时,它会以红色突出显示这些内容,以便您可以快速单击它并找到显示问题的行。
请参阅此处的示例。查看该链接中的 Samurai 输出图像。绿色细胞很好。红色和灰色单元格需要查看。
生成线程转储:
(Linux)
如果 JVM 在控制台中运行,则只需按Ctrl-\
。如果 JVM 在后台运行,则向其发送 QUIT 信号:
kill -QUIT process_id
其中 process_id 是正在运行的 Java 进程的进程号。线程转储也将被发送到标准输出被重定向的任何地方。您通常可以使用以下命令获取所有正在运行的 Java 进程的进程号:
ps axf | grep java
你说你的java进程还在,对吧?只要附加了线程,进程就存在,对吗?如果是这样,我会采用以下方法: - 运行带有 MBean 服务器的进程,并由 JVM 在内部进行管理
然后在发送 QUIT 信号后连接到进程并获取线程转储(应该有一个 JMX。看看哪些线程对你来说看起来很可疑。
我认为您也可以使用 JVisualVM 进行线程转储...