如何调试挂起的java线程?

Jim*_*Jim 8 java debugging multithreading tomcat

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

avi*_*iad 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