使用 MAT 分析 JVM Heap Dump
in Tutorial with 0 comment
使用 MAT 分析 JVM Heap Dump
in Tutorial with 0 comment

Heap Dump

一个 Heap Dump 是指在某个时刻对一个 Java 进程所使用的内存情况的一次快照。也就是在某个时刻把Java进程的内存以某种格式持久化到了磁盘上。Heap Dump 的格式有很多种,而且不同的格式包含的信息也可能不一样。但总的来说,Heap Dump 一般都包含了一个堆中的 Java Objects, Class 等基本信息。同时,当你在执行一个转储操作时,往往会触发一次 GC,所以你转储得到的文件里包含的信息通常是有效的内容(包含比较少,或没有垃圾对象了)

我们可以在 Heap Dump 获取以下基本信息(一项或者多项,与 Dump 文件的格式有关):

一个 Heap Dump 是不包含内存分配信息的,也就是说你无法从中得知是谁创建了这些对象,以及这些对象被创建的地方是哪里。

但是通过分析对象之间的引用关系,往往也能推断出相关的信息了。

Dominator Tree

Dominator Tree(支配树)是一个对象图, 它将对象的引用关系转换成一种树形的对象图结构. 通过它可以很轻松地看出对象的引用关系以及哪些最大的内存使用块。

一个对象Y从其开始(可能是GC Roots)到其节点的每条路径都必须经过X对象的话, 那么就是X支配(dominates)Y。

离Y最近的主宰对象, 称之为Y的直接支配(immediate dominator)。

在Dominator Tree(支配树)中, 每个对象都是其子对象的直接支配, 故而对象的引用关系也很好定位。

Dominator Tree(支配树)包含如下几点特征:

1536823826319-c2d70adf-70f8-4d2f-8f02-fa970216fc45-image.png

MAT 简介

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

选择报告类型

用 MAT 打开一个 dump 后,会让我们选择其中一种报告类型。

1536821966656-0410c9e6-26a6-4a0e-b0a3-5eb595d049be-image-resized.png

Leak Suspects Report

一般情况下选择Leak Suspects Report。等待一段时间之后,根据会自动弹出一个报告出来。

1536822238019-e25a1c83-30a6-4e5c-87fd-0534e7980373-image-resized.png

报告显示大概有 11.3GB 的内容是有问题的。而这个问题部分都是 "org.elasticsearch.common.cache.Cache" ,如下:

1536822275094-9dbd2c4a-99cb-47a5-a4a7-6c76781e3658-image-resized.png

Top Components Report

1536823194039-807f93db-9112-4abe-96c3-c26b88942e57-image-resized.png

1536823226935-e24abbde-c3fe-4bb0-a612-d2da799b410e-image-resized.png

高级用法

进入默认的 Overview

Overview
1536822507761-0bf779c8-2619-4d28-a26c-a5ea402d5064-image-resized.png

从上图可以看到它的大部分功能。主要功能有 Action 和 Report。上面我们已经简单生产过两种报告了。

Actions
1、Histogram:可以列出内存中的对象,对象的个数以及大小
2、Dominator Tree:可以列出那个线程,以及线程下面的那些对象占用的空间
3、Top consumers :通过图形,按照类名和包名分类,列出最大的 object
4、Duplicate Classes :通过类加载器去分析 Class Loader

Reports
1、Leak Suspects:自动分析泄漏的报告和 dump 概览
2、Top Components:分析使用大于1%的各部分组件的情况报告

Actions

Histogram
1536823536190-43c1ff15-eaba-4ed7-bcb7-30f15d6c7c07-image-resized.png
Dominator Tree
1536823576321-60002d45-9505-45e6-adb7-bfb63ee13af2-image-resized.png
Top consumers
1536823615087-1e7fa2a8-a903-456d-9a15-c7fc4df4055f-image-resized.png
Duplicate Classes
1536823646462-ffd1d196-cb98-43c9-bf6a-8184947b4732-image-resized.png

关注的指标

基本思路是【找出最大的部分】。

最直接是通过“Histogram” 可以直接观察各部分情况,但往往还不够。

我们需要通过 "Top Consumers" 可以根据包/类名/Class Loader进一步找出出那些"大对象"们。

找出来的"大对象"后,就可以 通过 "Dominator Tree" 定位这些"大"的内容具体有什么,从而更好地判断问题点。

参考链接

https://mingjunli.gitbooks.io/mat/content/

Responses