4

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

是否有一些工具可以提供 PID,它会告诉我每个线程当前所在的位置以及变量的一些值?我正在运行Linux。

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

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

有任何想法吗?

4

3 回答 3

11

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

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

于 2011-11-14T19:16:24.887 回答
4

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

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

关于 jmap 的一些信息: Java memory profiling with jmap and jhat

于 2011-11-14T19:08:55.573 回答
0

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

于 2017-07-04T17:03:01.837 回答