2010-03-02 42 views
2

我有一个web应用程序在jboss应用程序服务器上运行(但它不是特定的jboss,所以我们也可以认为它是一个tomcat或任何其他服务器)。现在我遇到了一个线程似乎处于死锁状态的问题。它始终使用100%的CPU。我已启动具有启用调试端口的服务器,并且可以将Eclipse连接到它。但问题是:有很多线程在运行。我如何找到正确的线程?我知道进程ID(来自Linux“top”命令),但我认为这没有帮助。我真的必须单独打开每个线程,并检查他们目前正在做什么?或者有没有一种方法来过滤“最活跃”的线程或类似的东西在Eclipse中?如何在Eclipse远程调试器中发现有问题的线程?

回答

2

您可以尝试生成线程转储(CTRL + Break,如this thread所示)。

或者您可以将JConsole附加到远程会话(因此暂时搁置Eclipse),监视线程并生成线程转储。

alt text http://www.jroller.com/dumpster/resource/tdajconsole.png

+1

一个简单的线程转储确实是我所需要的。为了找到使用这么多CPU的线程,我可以在Linux上使用程序“htop”,它也可以显示和CPU使用 - 排序线程(而不仅仅是“top”)。所以htop给了我一个线程ID,并且这个线程ID也可以在线程转储中找到,它给了我有问题代码的堆栈跟踪。完善。 – kayahr 2010-04-11 14:55:51

1

好像是你需要确定哪个线程首先吃CPU来缩小范围到具有错误的代码,那么该代码是由该线程,并在这一点上,你可以执行远程调试。

我会建议使用像JProfiler,jvisualvm,jconsole或类似的东西。使用这些工具之一可以让你深入了解线程正在做什么,并且允许你通过使用的cpu循环对线程进行排序,因此您可以快速找到有问题的线程。