情况:
我有一个 Java1.7 进程在 CentOS6 中运行,有多个线程。当前进程停止(即卡在某种循环或等待函数中)。由于程序的复杂性,很难在例如 Eclipse 中进行例行调试(更多解释在下面的背景部分)。因此,我想通过跟踪当前运行的堆栈来调试代码。
问题:
是否有 Linux 命令允许我打印堆栈以识别当前正在运行的线程/方法,以便我可以找到导致暂停的方法?
背景:
Eclipse无法调试的原因:
- 这是一个通常在多台计算机上运行的 MapReduce 程序。
- 即使我在一台计算机上运行,它仍然涉及多个线程同时运行。
- 最重要的是,“停止错误”是随机发生的(即无法重现)。所以我最好的办法是确定导致错误的当前运行方法。
P.S.我的方法可能完全错误,所以请随时纠正我并指出正确的方向。
感谢您的帮助。
最佳答案
您可以使用 JStack获取当前线程转储。它应该为您提供当前正在运行的线程及其堆栈跟踪。
它甚至会为您做更多事情 - 如果出现任何死锁,它会告诉您。
除此之外,您还可以使用 JVisualVM实时监控您的应用程序(您可以在那里实时检查线程并从中获取线程转储)。
关于java - 是否有 Linux 命令来打印正在运行的 Java 进程的当前堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560415/