jhat抛出未识别的魔数错误

6
我正尝试分析一个Java进程的堆转储文件,该进程遇到了内存问题。使用jmap获取了该转储文件。我正在使用jhat处理该转储文件,但是我得到了以下错误信息: java.io.IOException: Unrecognized magic number: 169897589 at com.sun.tools.hat.internal.parser.Reader.readFile(Reader.java:94) at com.sun.tools.hat.Main.main(Main.java:159) 无论是jdk 1.6还是1.7都会出现相同的错误。我在本地Windows机器上运行jhat(在将转储文件复制过来后),而转储文件是在Linux服务器上获取的。
你有什么想法我在哪里出错了吗?

我们能看到一些代码吗,这样我们就可以了解你做错了什么? - fcm
我的问题与 jhat 抛出的错误有关 - 我相信这个问题不需要直接涉及源代码。 - Bhaskar
3个回答

4
如果您查看com.sun.tools.hat.internal.parser.Reader的源代码,您会发现它正在寻找魔数0x4a415641。此值用于帮助识别有效的堆转储文件。jmap应该将此值附加为其创建的任何堆转储文件的前四个字节。
我建议您在十六进制编辑器中打开堆转储文件,并检查前四个字节是否为0x4a415641。请在Linux和Windows机器上都检查文件。也许在传输文件时文件被损坏了。

1

也许你生成JVM转储文件的方式不正确。当使用jmap -histo {pid} > dump.log时,就会出现错误。

尝试使用以下命令:

   jmap -dump:live;file=filename pid

祝好运。


0
很可能,您正在向jhat工具提供一个zip文件(.gz或.tar.gz)。这就是为什么它无法验证hprof头的原因。最近,我遇到了同样的情况。我的堆转储是在Linux服务器上以.tar.gz格式捕获的,并且我按原样提供以获得与您相同的错误。解压文件后,jhat能够分析.hprof文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接