情况:
我在CentOS6中运行了一个带有多个线程的 Java1.7 进程。当前暂停的过程(即陷入某种循环或等待功能)。由于程序的复杂性,很难在例如Eclipse中进行例行调试(在下面的背景部分中有更多解释)。因此,我想通过跟踪当前正在运行的堆栈来调试代码。
问题:
是否有Linux命令允许我打印堆栈以识别当前正在运行的线程/方法,以便我可以找到导致暂停的方法?
背景
无法在Eclipse中调试的原因:
P.S。我的方法可能完全错误,所以请随意纠正我并指出正确的方向。
感谢您的帮助。
答案 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