Heap Dump
一个 Heap Dump 是指在某个时刻对一个 Java 进程所使用的内存情况的一次快照。也就是在某个时刻把Java进程的内存以某种格式持久化到了磁盘上。Heap Dump 的格式有很多种,而且不同的格式包含的信息也可能不一样。但总的来说,Heap Dump 一般都包含了一个堆中的 Java Objects, Class 等基本信息。同时,当你在执行一个转储操作时,往往会触发一次 GC,所以你转储得到的文件里包含的信息通常是有效的内容(包含比较少,或没有垃圾对象了)
我们可以在 Heap Dump 获取以下基本信息(一项或者多项,与 Dump 文件的格式有关):
- 所有的对象信息
对象的类信息、字段信息、原生值(int, long等)及引用值 - 所有的类信息
类加载器、类名、超类及静态字段 - 垃圾回收的根对象
根对象是指那些可以直接被虚拟机触及的对象 - 线程栈及局部变量
包含了转储时刻的线程调用栈信息和栈帧中的局部变量信息
一个 Heap Dump 是不包含内存分配信息的,也就是说你无法从中得知是谁创建了这些对象,以及这些对象被创建的地方是哪里。
但是通过分析对象之间的引用关系,往往也能推断出相关的信息了。
Dominator Tree
Dominator Tree(支配树)是一个对象图, 它将对象的引用关系转换成一种树形的对象图结构. 通过它可以很轻松地看出对象的引用关系以及哪些最大的内存使用块。
一个对象Y从其开始(可能是GC Roots)到其节点的每条路径都必须经过X对象的话, 那么就是X支配(dominates)Y。
离Y最近的主宰对象, 称之为Y的直接支配(immediate dominator)。
在Dominator Tree(支配树)中, 每个对象都是其子对象的直接支配, 故而对象的引用关系也很好定位。
Dominator Tree(支配树)包含如下几点特征:
- X的子树的所有对象, 即是X的Retained Set。
- 如果X是Y的直接支配, 那么X的直接支配肯定也支配Y, 以此类推。
- Dominator Tree(支配树)中的线并不直接对应对象图中对象的引用关系, 例如下图中的D和F的关系。
MAT 简介
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。
选择报告类型
用 MAT 打开一个 dump 后,会让我们选择其中一种报告类型。
Leak Suspects Report
一般情况下选择Leak Suspects Report
。等待一段时间之后,根据会自动弹出一个报告出来。
报告显示大概有 11.3GB 的内容是有问题的。而这个问题部分都是 "org.elasticsearch.common.cache.Cache"
,如下:
Top Components Report
高级用法
进入默认的 Overview
Overview |
---|
从上图可以看到它的大部分功能。主要功能有 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 |
---|
Dominator Tree |
---|
Top consumers |
---|
Duplicate Classes |
---|
关注的指标
基本思路是【找出最大的部分】。
最直接是通过“Histogram” 可以直接观察各部分情况,但往往还不够。
我们需要通过 "Top Consumers" 可以根据包/类名/Class Loader进一步找出出那些"大对象"们。
找出来的"大对象"后,就可以 通过 "Dominator Tree" 定位这些"大"的内容具体有什么,从而更好地判断问题点。
参考链接
https://mingjunli.gitbooks.io/mat/content/
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。