如何在java中使用jmap分析堆转储

时间:2013-02-28 08:38:00

标签: java jmap

我使用以下命令创建堆转储:

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

我已经打开了生成的文件--DumpFile.txt,但它不是可读格式。 所以,请让我知道如何分析生成的文件中的数据。

7 个答案:

答案 0 :(得分:52)

您应该使用jmap -heap:format=b <process-id>而不使用任何路径。因此,它会创建一个* .bin文件,您可以使用jvisualvm.exe打开该文件(与jmap相同的路径)。这是打开此类转储文件的绝佳工具。

答案 1 :(得分:35)

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

jhat [ options ] <heap-dump-file>

jhat命令解析java堆转储文件并启动Web服务器。 jhat使您可以使用自己喜欢的webbrowser浏览堆转储。

请注意,您应该有一个hprof二进制格式输出,以便能够使用jhat对其进行解析。您可以使用format=b选项以此格式生成转储。

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

答案 2 :(得分:10)

很晚才回答这个问题,但值得快速看一下。只需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,即JVM ID)

转到CMD并输入以下命令&gt;

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

17252是我们需要的vmid。

现在我们将学习如何使用jmap和jhat

使用jmap - 生成堆转储

来自java docs jmap “jmap打印给定进程或核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息”

使用以下命令生成堆转储&gt;

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

17252是vmid(从上面挑选)。

将在E:\ 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

答案 3 :(得分:9)

如果您使用Eclipse作为IDE,我会推荐优秀的eclipse插件memory analyzer

另一种选择是使用JVisualVM,它也可以读取(和创建)堆转储,并随每个JDK一起提供。您可以在JDK的bin目录中找到它。

答案 4 :(得分:5)

VisualVm不附带Apple JDK。您可以将VisualVM Mac应用程序包(dmg)用作单独的应用程序,以弥补这一点。

答案 5 :(得分:0)

MAT,jprofiler,jhat是可能的选择。由于jhat带有jdk,你可以轻松启动它来做一些基本的分析。 check this out

答案 6 :(得分:0)

如果仅运行jmap -histo:live或jmap -histo,它将在控制台上输出内容!