如何找到通过jstack找到阻塞线程的原因?

时间:2011-09-24 20:06:28

标签: java multithreading

我在我的java应用程序上运行jstack(在tomcat和ubuntu服务器版本上运行),因为它似乎在一段时间后消耗了大量内存。

所以,使用jstack我发现许多线程似乎被阻止了:

控制台日志http://dl.dropbox.com/u/17844821/zeug/threaddumpexception.txt

Threaddump http://dl.dropbox.com/u/17844821/zeug/threaddump.txt

所以,我知道线程被阻塞但是我怎么能找出哪个java类导致这个甚至更重要:我如何强制这些线程终止?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

由jstack产生的threaddump不正确。

我必须做两件事来获得正确的转储:

  1. 用sun的原始sun-6-jdk和sun-6-jre包取代OpenJDK
  2. 我修改了jstack调用以使用64位模式并将其作为tomcat-user运行,如下所示:sudo -u tomcat6 jstack -J-d64 -m pid
  3. 这给了我一个看起来正确的threaddump(没有被阻塞的线程)。

答案 1 :(得分:0)

我认为这些线程正在等待一些正常的IO(套接字,记录器和其他)。

通常,当一个线程被阻塞时,jstack会显示完整的堆栈直到阻塞调用。

您可以分析堆栈并检查调用跟踪,并确定此线程是否被阻止了某些错误/问题,或者是否正常执行了服务器或应用程序。

[]的,

过去