2012-07-10 87 views
8

我有以下问题:
我部署到Tomcat(Linux)的Web应用程序和Tomcat的关机后,如果我做ps -ef我仍然可以看到java进程在运行。
我相信这是由于一些挂线,但我不知道如何跟踪这个线程。
如何调试此问题?如何调试挂起的Java线程?

回答

5

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

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

现在,当您通过Samurai运行这些,它会突出这些在红色,因此您可以快速地点击它,并获得展示问题的线条。

查看here的示例。查看该链接中的Samurai输出图像。绿色的细胞很好。红色和灰色细胞需要观察。如果JVM在一个控制台上运行,则只需按Ctrl-\

(Linux)的

生成线程转储。 如果JVM在后台运行,然后把它的退出信号:

kill -QUIT process_id

有PROCESS_ID是正在运行的Java进程的进程数。线程转储将被发送到标准输出被重定向的任何地方。 通常你可以用命令得到的所有正在运行的Java进程的进程号:

ps axf | grep java

+0

它不是吉姆是要求,他要求调试计算策略。 – 2012-07-10 06:03:05

+0

@ user1348753,see edit。 – aviad 2012-07-10 06:10:51

+0

@aviad:我做了一个'kill -3',并将javacore加载到Samurai.There没有可视化表,只是日志报告t。我可以如何追踪此报告中的线索? – Jim 2012-07-10 07:07:01

2

你说你的java进程仍然存在,对不对? 只要有线程连接,进程就存在了,对吧? 如果是的话,我会去以下方法: - 运行附带MBean服务器进程,由JVM

内部管理然后您发送后的退出信号和获得线程转储连接到工艺(有应该是一个JMX该见哪个线程看起来可疑的给你。

我想你也可以使用JVisualVM采取线程转储...

+0

我不知道如何做你推荐的方法 – Jim 2012-07-10 06:17:46

+0

这看起来更容易,但它是已经由aviad建议:):http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx – 2012-07-10 06:38:11

+0

至于JVisualVM的方法 - 这里是一个教程http://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html。基本上jvisualvm只是一个可执行文件,可以在$ JAVA_HOME/bin文件夹中找到...运行它,连接到你的应用程序,看看你可以用它做什么。相当强大的东西,真的:) – 2012-07-10 06:40:29