2016-11-23 64 views
0

遵循以下流程,但我無法分析生成的轉儲。從Java進程獲取堆轉儲以調試內存泄漏

  1. 我試圖從Java程序在Linux上使用機器上運行得到堆轉儲 「JMAP -F轉儲:格式= B,文件=的/ tmp/test.hprof」
  2. 按Ctrl跨度後+ C 60秒
  3. 上述步驟生成的堆轉儲使用Eclipse MAT(內存分析工具)啓動,但是我看到以下錯誤。

發生內部錯誤:「解析來自'/users/sobhan/Test.hprof'的堆轉儲'」。 java.lang.NullPointerException

PS:我試過其他分析工具,如VisualVM,IBM Heap Analyzer,結果是一樣的。我認爲堆轉儲已損壞(使用Ctrl + C在這裏是否有問題?)。如果是這樣,請建議正確的方式優雅退出'jmap'

在此先感謝。

+0

'Ctrl + C在60秒之後' - >沒有工具能夠解析被截斷的堆轉儲 –

+0

你能否建議在特定時間之後正常退出jmap的方式@IngoKegel – Sobhan

+0

不,這是不可能的,它必須完成regulary –

回答

0

您需要等待堆轉儲完成。根據堆的大小,可能需要幾秒到幾分鐘的時間。至少一次,我花了20分鐘(如果我沒有記錯的話,轉儲的大小約爲10G)。你可以嘗試使用「-dump:live」選項,它只會轉儲活動對象並且不會產生垃圾。

jmap -F -dump:live,format=b,file=<file_name.hprof> <rdu_process_id> 

但是,您可能也遇到this issue