我有一个正在运行的 java 软件被卡住了。我想看看里面,但不知道怎么做。
是否有一些工具可以提供 PID,它会告诉我每个线程当前所在的位置以及变量的一些值?我正在运行Linux。
我或多或少知道是什么导致了问题,但仍有一些可能的情况,因此确定它会很好。
我无法重现错误,因为它每隔几天出现一次,并且在调试时从未出现过,所以这是一个独特的认识敌人的变化。
有任何想法吗?
我有一个正在运行的 java 软件被卡住了。我想看看里面,但不知道怎么做。
是否有一些工具可以提供 PID,它会告诉我每个线程当前所在的位置以及变量的一些值?我正在运行Linux。
我或多或少知道是什么导致了问题,但仍有一些可能的情况,因此确定它会很好。
我无法重现错误,因为它每隔几天出现一次,并且在调试时从未出现过,所以这是一个独特的认识敌人的变化。
有任何想法吗?
您可以对其进行线程转储。您可以使用kill -3 PID
其中 PID 是您的进程 ID。这将导致线程转储输出到程序的标准输出。
这将向您展示每个线程在做什么,但不会为您提供有关变量的任何信息。无论如何,线程转储真的很有用。我会从那里开始。如果您仍然无法解决问题,您可以使用 jmap(JVM 工具,免费但更难使用)或 YourKit(付费产品,但非常好)之类的东西来拍摄内存快照,并检查变量。
关于 jmap 的一些信息: Java memory profiling with jmap and jhat
在最近的 JVM(OpenJDK/Oracle Java 7 或更高版本)上,如果您进行堆转储(使用 VisualVM 或 jmap),它还包括所有当前正在运行的线程的堆栈的转储,以及指向堆中相应对象的链接. 然后,您可以通过在 VisualVM 中打开堆转储来查看堆栈。