提问者:小点点

jhat投掷无法识别的魔法数字


我正在尝试分析从遇到内存问题的java进程中获取的堆转储。转储是使用jmap进行的。我正在转储文件上使用jhat-我得到了

java.io. IOException:无法识别的魔法数字:169897589 atcom.sun.tools.hat.java.io.parser.Reader.readFile(Reader.java:94)atcom.sun.tools.main.main(Main.java:159)

jdk1.6和1.7都有同样的错误。我在本地Windows机器上运行jhat(复制转储文件后),转储文件被带到Linux服务器上。

知道我做错了什么吗?


共3个答案

匿名用户

如果您查看com.sun.tools的源代码,您会发现它正在寻找神奇的数字0x4a415641。

此值用于帮助识别有效的堆转储文件。jmap应将此值附加为它创建的任何堆转储文件的前四个字节。

我建议在十六进制编辑器中打开堆转储并检查前四个字节是否为0x4a415641。检查Linux和Windows机器上的文件。也许文件在传输文件时损坏了。

匿名用户

可能是你生成jvm dump文件的方式不对。使用jmap-histo{pid}时出错

尝试

   jmap -dump:live;file=filename pid

祝你好运。

匿名用户

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