2013-03-19 498 views
3

我想分析一个堆转储取自一个java进程,遇到内存问题。转储是使用jmap进行的。我使用上与jHat转储文件 - 我得到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服务器上执行转储文件。

任何想法我做错了什么?

+0

我们是否可以看到一些代码,以便我们可以了解您做错了什么? – fcm 2013-03-19 18:02:17

+0

我的问题是关于抛出错误的jhat - 源代码不应该直接需要我相信的问题。 – Bhaskar 2013-03-19 18:05:53

回答

2

如果你看看com.sun.tools.hat.internal.parser.Reader的源代码,你会发现它正在寻找神奇的号码0x4a415641

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

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

0

很可能,你错误的方式来生成jvm转储文件。 使用jmap -histo {pid}> dump.log时会发生错误。

尝试

 
    jmap -dump:live;file=filename pid 

好运。