是否有Linux命令来打印正在运行的Java进程的当前堆栈

时间:2014-08-29 01:31:16

标签: java linux debugging stack-trace

情况:

我在CentOS6中运行了一个带有多个线程的 Java1.7 进程。当前暂停的过程(即陷入某种循环或等待功能)。由于程序的复杂性,很难在例如Eclipse中进行例行调试(在下面的背景部分中有更多解释)。因此,我想通过跟踪当前正在运行的堆栈来调试代码。

问题:

是否有Linux命令允许我打印堆栈以识别当前正在运行的线程/方法,以便我可以找到导致暂停的方法?

背景

无法在Eclipse中调试的原因:

  1. 这是一个MapReduce程序,通常在多台计算机上运行。
  2. 即使我在一台计算机上运行,​​它仍然需要同时运行多个线程。
  3. 最重要的是,"停止错误"随机发生(即,不能再现)。所以我最好的方法是确定导致该错误的当前运行方法。
  4. P.S。我的方法可能完全错误,所以请随意纠正我并指出正确的方向。

    感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用JStack来获取当前的线程转储。它应该为您提供当前正在运行的线程及其堆栈跟踪。

它甚至会为你做更多的事情 - 如果出现任何死锁,它会告诉你它们。

除此之外,您还可以使用JVisualVM实时监控您的应用程序(您可以在那里实时检查线程并从中获取线程转储)。

答案 1 :(得分:1)

来自RedHat

  

以下是在Unix上生成Java线程转储的方法:

     

1)注意Java进程的进程ID号(例如使用top,a   grep on ps -axw等)并将QUIT信号发送到进程   kill -QUIT或kill -3命令。例如:

     

kill -3 JAVA_PID