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

omqzjyyz  于 2023-06-04  发布在  Java
关注(0)|答案(7)|浏览(358)

我正在使用下面的命令创建堆转储:

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

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

7fhtutme

7fhtutme1#

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

8nuwlpux

8nuwlpux2#

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

jhat [ options ] <heap-dump-file>

jhat命令解析java堆转储文件并启动web服务器。jhat使您能够使用您喜欢的web浏览器浏览堆转储。
请注意,您应该有一个hprof二进制格式的输出,以便能够用jhat解析它。您可以使用format=b选项生成这种格式的转储。

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

iq0todco3#

很晚才回答这个问题,但值得快速浏览一下。只需要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并在下面键入命令>

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

17252是我们需要的vmid。

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

使用jmap -生成堆转储

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

使用以下命令生成堆转储>

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

其中17252是vmid(从上面选取)。
将在E:\heapDump.jmap中生成堆转储
现在使用JhatJhat用于分析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

zzlelutf

zzlelutf4#

如果您使用Eclipse作为IDE,我推荐优秀的Eclipse插件memory analyzer
另一个选择是使用JVisualVM,它也可以读取(和创建)堆转储,并且每个JDK都附带。您可以在JDK的bin目录中找到它。

luaexgnf

luaexgnf5#

VisualVm不随Apple JDK一起提供。您可以使用VisualVM Mac应用程序包(dmg)作为一个单独的应用程序,以弥补这一点。

u5rb5r59

u5rb5r596#

MAT、jprofiler、jhat是可能的选项。由于jhat是随jdk一起提供的,因此您可以轻松地启动它来进行一些基本分析。check this out

h7appiyu

h7appiyu7#

如果您只是运行jmap -histo:live或jmap -histo,它会在控制台上输出内容!

相关问题