MAT 分析 Heap Dump 需要关注的指标

in Tutorials with 21 comments

什么是 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

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

HistogramDominator Tree
1536823536190_43c1ff15_eaba_4ed7_bcb7_30f15d6c7c07_image_resized.png1536823576321_60002d45_9505_45e6_adb7_bfb63ee13af2_image_resized.png
Top consumersDuplicate Classes
1536823615087_1e7fa2a8_a903_456d_9a15_c7fc4df4055f_image_resized.png1536823646462_ffd1d196_cb98_43c9_bf6a_8184947b4732_image_resized.png

关注的指标

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

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

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

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

参考链接

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

Responses
  1. 很棒的主题,已启用

    Reply
  2. 写的很好,很喜欢

    Reply
  3. Langlangago

    喜欢这个主题

    Reply