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

Cha*_*nya 55 java jmap

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

jmap -dump:file=DumpFile.txt <process-id>
Run Code Online (Sandbox Code Playgroud)

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

yve*_*ler 53

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

  • 从 JDK 9 开始,Visual VM 将不再包含在 Oracle JDK 中。想要将 Visual VM 与 Oracle JDK 9 或更高版本一起使用的开发人员可以从 Visual VM 开源项目网站获取它。 (2认同)

Nis*_*hth 36

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

jhat [ options ] <heap-dump-file>
Run Code Online (Sandbox Code Playgroud)

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

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

-dump:format=b,file=<filename>
Run Code Online (Sandbox Code Playgroud)


Ank*_*tal 11

很晚才回答这个问题,但值得快速看一下.只需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");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用jps查找vmid(虚拟机ID即JVM id)

转到CMD并键入以下命令>

C:\>jps
18588 Jps
17252 GarbageCollectionAnalysisExample
16048
2084 Main
Run Code Online (Sandbox Code Playgroud)

17252是我们需要的vmid.

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

使用jmap - 生成堆转储

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

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

C:\>jmap -dump:file=E:\heapDump.jmap 17252
Dumping heap to E:\heapDump.jmap ...
Heap dump file created
Run Code Online (Sandbox Code Playgroud)

其中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.
Run Code Online (Sandbox Code Playgroud)

默认情况下,它将在端口7000上启动http服务器.然后我们将转到http:// localhost:7000 /

礼貌:JMAP,如何以10种方式监控和分析垃圾收集


pus*_*shy 9

如果您使用Eclipse作为IDE,我会推荐优秀的eclipse插件内存分析器

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


小智 5

VisualVm没有Apple JDK.您可以将VisualVM Mac应用程序包(dmg)用作单独的应用程序,以弥补这一点.