从Java运行程序或转储中获取死锁检测

我有一个运行的java软件被卡住了。 我想在里面看到一个视图,但不知道该怎么做。

是否有一些工具可以给出一个PID,它会告诉我每个线程当前位于何处以及可能还有一些变量值? 我正在运行linux。

我或多或少知道导致问题的原因,但仍有一些可能的情况,因此确定它会很好。

我无法重现错误,因为它每隔几天才会出现,并且在调试时从未出现过,所以这是了解敌人的独特变化。

有任何想法吗?

实际上你可以尝试使用visualvm +它的线程监控插件 。 您还可以进行线程转储,查看线程堆栈跟踪其状态。 您还可以使用jconsole来检测死锁。 这两个工具都是JDK的一部分。 JConsole的

以下是使用visualvm进行线程分析的更多信息。

你可以采取它的线程转储。 您可以使用kill -3 PID ,其中PID是您的进程ID。 这将导致线程转储输出到程序的标准输出。

这将显示每个线程正在做什么,但不会向您提供有关变量的任何信息。 无论如何,线程转储确实很有用。 我会从那里开始。 如果仍然无法解决问题,可以使用jmap(JVM工具,免费但更难使用)或者YourKit(付费产品但非常好)来获取内存快照,并检查变量。

有关jmap的一些信息: 使用jmap和jhat进行Java内存分析

在最近的JVM(OpenJDK / Oracle Java 7或更高版本)上,如果您进行堆转储(使用VisualVM或jmap),它还包括所有当前正在运行的线程的堆栈的转储,其中包含指向堆中相应对象的链接。 然后,您可以通过在VisualVM中打开堆转储来查看堆栈。