繁体   English   中英

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

[英]How to analyse the heap dump using jmap in java

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

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

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

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

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

jhat [ options ] <heap-dump-file>

jhat 命令解析 Java 堆转储文件并启动网络服务器。 jhat 使您能够使用您最喜欢的网络浏览器浏览堆转储。

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

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

回答这个问题很晚,但值得快速浏览一下。 只需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 - 生成堆转储

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

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

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/

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

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

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

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

MAT、jprofiler、jhat 是可能的选项。 由于 jhat 自带 jdk,您可以轻松启动它进行一些基本分析。 看一下这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM