JVM调优使用工具05(MAT)

2020/12/07 Jvm

JVM调优使用工具05(MAT)

目录

MAT简介

1.一个快速且功能丰富的JAVA堆内存分析器,可以帮助查找内存泄漏和用来减少内存消耗建议。

官方网站:https://www.eclipse.org/mat/

使用文档:https://help.eclipse.org/2020-03/index.jsp

主要功能

1.找出内存泄漏的原因
2.找出重复引用的类和jar
3.分析集合的使用
4.分析类加载器

浅堆与保留堆

1.浅堆(Shallow Heap):一个对象消耗的内存。
2.X的保留集(Retained set):当X被垃圾回收时,由GC删除的对象集。同理,如果X没有被回收,
  那么该集合的对象都会“保留下来”。
3.X的保留堆(Retained heap): X的保留集中的所有对象的浅层大小的总和,即X保持活动的内存。
  换而言之,Retained heap指的是对象X的保留内存大小,即由于它存活导致的内存没有被回收。
4.前导对象集的保留集:前导对象不可到达时,被释放的那些对象。

使用窗口

1.主界面

1.Overview    //对软件的一些介绍
2.Tutorlals   //教程
3.WorkdBench  //工作台,平时用的地方

2.打开dump文件

左上角File-->Acquire Heap Dump
     选择进程,然后自动dump进程的内存进行分析

这个功能是自动dump正在运行的进程,然后进行内存分析,用的比较少。
重点:
    从linux下执行命令:
       1.jmap -dump:live,format=b,file=myjmapfile.hprof 进程id
       2.使用压缩命令,加快传输效率:
         tar -cvf 打包文件名 源文件
              选项:
              -c :打包
              -v :显示过程
              -f :指定打包后的文件名
              例如
                tar -cvf 牛牛.tar 牛牛
       3.sz传输压缩文件到本地

    用好压2345解压后,直接打开就行:
    左上角File-->Open Heap Dump-->选择文件

================主界面=================

常用的几个:
    6.常用的分析动作(支配树...)
    7.报告相关(分析内存泄漏)

也就是上图中的:
   Histogram
   Leak Suspects

3.Histogram

这个功能主要是查看类和对象关系,对象和对象之间的关系,用来定位哪些对象在FGC之后还活着,哪些对象占大部分内存。、

1.点开Histogram,可列出每一个类的实例数,支持正则表达式查找,也可以计算出该类所有对象的retained size。

Shallow Heap就是对象本身占用内存的大小,不包含其引用的对象内存,实际分析中作用不大。常规对象(非数组)的ShallowSize由其成员变量的数量和类型决定。
数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定。对象成员都是些引用,真正的内存都在堆上,
看起来是一堆原生的byte[], char[], int[],对象本身的内存都很小。

Retained Heap值的计算方式是将Retained Set(当该对象被回收时那些将被GC回收的对象集合)中的所有对象大小叠加。
或者说,因为X被释放,导致其它所有被释放对象(包括被递归释放的)所占的heap大小。

Retained Heap例子:
一个ArrayList对象持有100个对象,每一个占用16 bytes,如果这个list对象被回收,那么其中100个对象也可以被回收,
可以回收16*100 + X的内存,X代表ArrayList的shallow大小。

所以,RetainedHeap可以更精确的反映一个对象实际占用的大小。

2.选择一个Class,右键选择List objects > with incoming references

在新页面会显示通过这个class创建的对象信息

3.选择一个对象,右键选择Path to GC Roots > **,通常在排查内存泄漏的时候,我们会选择exclude all phantom/weak/soft etc.references

意思是查看排除虚引用/弱引用/软引用等的引用链,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个对象否还存在Strong 引用链
(在导出HeapDump之前要手动出发GC来保证),如果有,则说明存在内存泄漏,然后再去排查具体引用。

这时会拿到GC Roots到该对象的路径,通过对象之间的引用,可以清楚的看出这个对象没有被回收的原因,然后再去定位问题。

假如说上面对象此时本来应该是被GC掉的,简单的办法就是将其中的某处置为null或者remove掉,使其到GC Root无路径可达,
处于不可触及状态,垃圾回收器就可以回收了。

4.Leak Suspects

Leak Suspects 界面提示可能存在内存的泄露。

5.内存快照对比

为了更有效率的找出内存泄露的对象,一般会获取两个堆转储文件(先dump一个,隔段时间再dump一个),通过对比后的结果可以很方便定位。

6.帮助

点击最上方--->help--->help contents
    有很详细的教程

7.部分参考文章(感谢):

链接:https://www.jianshu.com/p/738b4f3bc44b (占小狼)

Search

    Table of Contents