2013-02-28 61 views
43

我創建使用下面的命令堆轉儲:如何分析利用JMAP堆轉儲在java中

jmap -dump:file=DumpFile.txt <process-id> 

我已經打開生成的文件 - DumpFile.txt但它不是以可讀格式。 所以請讓我知道如何分析生成的文件中的數據。

+0

你試過'jmap -heap > DumpFile.txt'嗎? – 2013-04-24 10:14:29

+0

這個文件在Eclipse MAT中打開的很好,只是給它.hprof擴展 – iTake 2014-04-10 13:20:09

+0

另請參見http://stackoverflow.com/questions/185893/how-do-i-analyze-a-hprof-file – rogerdpack 2015-03-30 15:16:15

回答

31

您可以使用jhat(Java堆分析工具)來讀取生成的文件:

jhat [ options ] <heap-dump-file> 

的命令與jHat解析Java堆轉儲文件並啓動Web服務器。 jhat使您能夠使用您最喜愛的瀏覽器瀏覽堆轉儲。

請注意,您應該有一個hprof二進制格式輸出,以便能夠使用jhat解析它。您可以使用format=b選項以此格式生成轉儲。

-dump:format=b,file=<filename> 
+0

我運行了jhat命令分析堆轉儲文件,但我得到以下錯誤:'從447start.out讀取... java.io.IOException:無法識別的幻數:1027423549 at com.sun.tools.hat.internal.parser.Reader.readFile (Reader.java:81) at com.sun.tools.hat.Main.main(Main.java:143)'這裏447start.out是日誌文件的名稱。 – Chaitanya 2013-02-28 09:05:07

+0

嘗試像'format = b'選項那樣轉儲:'jmap -dump:format = b,file = ' – 2013-02-28 09:15:43

+0

jhat不是一個用戶友好的工具 – 2013-02-28 09:45:27

9

如果你使用Eclipse作爲IDE我會推薦優秀的Eclipse插件memory analyzer

另一種選擇是使用JVisualVM,它可以讀取(創建)堆轉儲的歡迎,並附帶每JDK。您可以在JDK的bin目錄中找到它。

+0

謝謝我下載軟件來分析問題。 – Chaitanya 2013-02-28 11:45:22

0

MAT,jprofiler,jhat是可能的選項。因爲jhat帶有jdk,你可以輕鬆啓動它來做一些基本的分析。 check this out

43

您應該使用jmap -heap:format=b <process-id>沒有任何路徑。因此它會創建一個* .bin文件,您可以使用jvisualvm.exe(與jmap的路徑相同)打開該文件。這是一個很好的工具來打開這樣的轉儲文件。

5

VisualVm不附帶Apple JDK。您可以使用VisualVM Mac Application捆綁包(dmg)作爲單獨的應用程序來彌補這一點。

2

很晚纔回答這個問題,但值得快速瀏覽一下。僅需2分鐘即可詳細瞭解。

首先創建這個java程序

import java.util.ArrayList; 
import java.util.List; 

public class GarbageCollectionAnalysisExample{ 
    public static void main(String[] args) { 
      List<String> l = new ArrayList<String>(); 
      for (int i = 0; i < 100000000; i++) { 
        l = new ArrayList<String>(); //Memory leak 
        System.out.println(l); 
      } 
      System.out.println("Done"); 
    } 
} 

使用JPS找到VMID(虛擬機ID IE JVM ID)

進入cmd,然後鍵入如下命令>

C:\>jps 
18588 Jps 
17252 GarbageCollectionAnalysisExample 
16048 
2084 Main 

17252是我們需要的vmid。

現在我們將學習如何使用JMAP和與jHat

使用JMAP - 產生堆轉儲

從約JMAP Java文檔「共享對象存儲地圖或堆內存的詳細信息JMAP打印給定過程或核心文件或遠程調試服務器」

使用以下命令來生成堆轉儲>

C:\>jmap -dump:file=E:\heapDump.jmap 17252 
Dumping heap to E:\heapDump.jmap ... 
Heap dump file created 

其中17252是vmid(從上面挑選)。

堆轉儲將在電子商務產生:\ heapDump.jmap

現在使用與jHat 與jHat用於在java中分析垃圾收集轉儲 -

C:\>jhat E:\heapDump.jmap 
Reading from E:\heapDump.jmap... 
Dump file created Mon Nov 07 23:59:19 IST 2016 
Snapshot read, resolving... 
Resolving 241865 objects... 
Chasing references, expect 48 dots................................................ 
Eliminating duplicate references................................................ 
Snapshot resolved. 
Started HTTP server on port 7000 
Server is ready. 

默認情況下,它會在端口7000上啓動http服務器。 然後我們將去http://localhost:7000/

提供:JMAPHow to monitor and analyze the garbage collection in 10 ways