9

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

4

2 回答 2

5

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

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

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

请参阅此处的示例。查看该链接中的 Samurai 输出图像。绿色细胞很好。红色和灰色单元格需要查看。

生成线程转储:

(Linux)

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

kill -QUIT process_id

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

ps axf | grep java

于 2012-07-10T06:01:09.493 回答
2

你说你的java进程还在,对吧?只要附加了线程,进程就存在,对吗?如果是这样,我会采用以下方法: - 运行带有 MBean 服务器的进程,并由 JVM 在内部进行管理

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

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

于 2012-07-10T06:10:21.867 回答