2013-03-19 57 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 

好運。

相關問題