如何分析来自 Java 核心转储的信息? [关闭]

Posted

技术标签:

【中文标题】如何分析来自 Java 核心转储的信息? [关闭]【英文标题】:How to analyze information from a Java core dump? [closed] 【发布时间】:2010-10-31 08:49:52 【问题描述】:

如果一个进程崩溃并留下一个核心转储,或者我使用gcore 创建了一个核心转储,那么我该如何分析它?

我希望能够使用jmapjstackjstat 等,还希望能够查看所有变量的值。

这样我就可以找到 JVM 崩溃或冻结的原因。

【问题讨论】:

什么是 Java 核心转储?您是指应用程序的堆栈跟踪还是 JVM 崩溃导致核心转储? 我们可以把它转换成维基吗?这不是一个编程问题。然而,它对于 unix 平台上的任何 java 程序员都非常重要。移至softwarerecs .. 是另一种选择。在任何情况下,请不要删除这个.. 【参考方案1】:

好的,如果您使用 gcore 或 gdb 创建了核心转储,那么您需要将其转换为称为 HPROF 文件的文件。这些可以由 VisualVM、Netbeans 或 Eclipse 的内存分析器工具(以前称为 SAP 内存分析器)使用。我推荐 Eclipse MAT。

要转换文件,请使用命令行工具 jmap

# jmap -dump:format=b,file=dump.hprof /usr/bin/java core.1234

地点:

dump.hprof 是您要创建的 hprof 文件的名称

/usr/bin/java 是生成核心转储的 java 二进制文件版本的路径

core.1234 是您的常规核心文件。

【讨论】:

我们可以使用 jdk1.5/bin/jmap 将使用 gcore 生成的 jdk 1.4 核心转储文件转换为 solaris 上的 hprof 吗?我尝试使用上面的命令,但它给出了错误:附加到核心文件时出错:找不到'UseSharedSpaces'标志 techzen:我对此不确定,恐怕..您确定在命令行上引用 1.4 java 可执行文件吗?如果是这样,那么可能只是 1.4 核心转储不兼容。 JVM崩溃时生成的mdmp文件是否可以使用jmap转换(docs.oracle.com/cd/E15289_01/doc.40/e15059/crash.htm)? 太糟糕了,我在运行 jmap 命令时遇到了这个异常,互联网上的某个地方说这是因为它是 java 的不同版本。但是,据我所知,两个 java 版本应该是相同的(尽管它在不同的主机上)。而且,假设它是不同的,如果有办法分析不同版本的java的核心文件?线程“main”中的异常 java.lang.reflect.InvocationTargetException ..... 原因:java.lang.InternalError: void* type has not been seen when parsing int *【参考方案2】:

如果您使用的是 IBM JVM,download IBM Thread and Monitor Dump Analyzer。这是一个很好的工具。它提供线程详细信息并可以指出死锁等。下面的blog post 提供了如何使用它的很好的概述。

【讨论】:

【参考方案3】:

也许 VisualVM 可以提供帮助(我自己还没有机会尝试)。链接:

http://java.sun.com/javase/6/docs/technotes/guides/visualvm/coredumps.html

【讨论】:

【参考方案4】:

您确定核心转储是您想要的吗?这将包含正在运行的 JVM 的原始内容,而不是 java 级别的信息。也许你更需要 JVM 堆转储。

【讨论】:

【参考方案5】:

实际上,VisualVM 可以处理应用程序核心转储。

只需调用“文件/添加 VM Coredump”,即可在应用程序资源管理器中添加一个新应用程序。然后,您可以获取该 JVM 的线程转储或堆转储。

【讨论】:

文件添加 vm coredump 对我来说是灰色的。不知道为什么 如果您在 Windows 上,则不支持它,并且很遗憾会显示为灰色。我在同一条船上。 visualvm.java.net/coredumps.html 如果 VisualVM 在 Solaris 或 Linux 上运行,Core Dump 节点在 Applications 窗口中可见。【参考方案6】:

见http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf。您可以直接在核心文件上使用“jdb”。

【讨论】:

那是你链接到那里的一个相当大的 pdf。介意给一个你所引用的指针吗? 该部分标题为“附加到同一台机器上的核心文件”,示例命令为jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:\javaExecutable=$JAVA_HOME/bin/java,core=core.20441【参考方案7】:

试试lady4j堆栈分析器,它可以帮助你:

http://www.lady4j.com/solveStack.jsp

【讨论】:

几年前关门了,这个答案应该隐藏【参考方案8】:

IBM 提供了许多工具,它们也可以在 sun jvm 上使用。看看 alphaworks 上的一些项目,它们提供了堆和线程转储分析器

卡尔

【讨论】:

【参考方案9】:

我推荐你试试Netbeans Profiler。它有丰富的实时分析工具。 来自 IbM 的工具值得一试进行离线分析

【讨论】:

【参考方案10】:

jhat 是我迄今为止使用过的最好的之一。要进行核心转储,我认为您最好使用 jmap 和 jps 而不是 gcore(我没有使用过)。查看链接以了解如何使用 jhat . http://www.lshift.net/blog/2006/03/08/java-memory-profiling-with-jmap-and-jhat

【讨论】:

以上是关于如何分析来自 Java 核心转储的信息? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Java.exe/jvm.dll 的符号文件以分析崩溃核心转储文件?

如何在 UNIX/Linux 中对生产应用程序进行核心转储分析?

比较 Java 内存堆转储:Java 桌面应用程序的内存分析 [关闭]

在Linux机器上运行C代码时出现分段错误(核心转储)[关闭]

代码分段错误(核心转储)pthread创建[关闭]

如何通过php将信息存储在转储中[关闭]