【调优工具】MAT内存分析工具

Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者

一、下载地址

官网下载链接
在这里插入图片描述

二、Heap Dump

Heap Dump,也叫堆转储文件,是java进程在某个时间内的快照
它在触发快照的时候保存了很多信息:java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC

Heap Dump信息:
Typical information which can be found in heap dumps (once more - depending on the heap dump type) is:

  • All Objects
    Class, fields, primitive values and references
  • All Classes
    Classloader, name, super class, static fields
  • Garbage Collection Roots
    Objects defined to be reachable by the JVM
  • Thread Stacks and Local Variables
    The call-stacks of threads at the moment of the snapshot, and per-frame information about local objects

怎样获取Dump

通过OOM获取

即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,在jvm中添加参数:

-XX:+HeapDumpOnOutOfMemoryError

主动获取

在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump

-XX:+HeapDumpOnCtrlBreak

使用HPROF agent

使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件
配置在虚拟机的参数如下:

-agentlib:hprof=heap=dump,format=b

jmap获取

jmap可以在cmd里执行,命令如下:

jmap -dump:format=b file=<文件名XX.hprof> <pid>

使用JConsole

Acquire Heap Dump

使用Memory Analyzer Tools的File -> Acquire Heap Dump功能

三、MAT用来做什么

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

四、MAT使用介绍

在这里插入图片描述

4.1 Histogram直方图

Histogram是使用最多的一个,可以列出内存中的对象,对象的个数及其大小

4.1.1 具体信息

具体信息

  1. Class Name : 类名称,java类名
  2. Objects : 类的对象的数量,这个对象被创建了多少个
  3. Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  4. Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

在这里插入图片描述

4.1.2 Group by packages查看

按包名的形式进行排列
在这里插入图片描述

4.1.3 查看GC Roots
  • 将列出该类的实例

在某一项上右键打开菜单选择list objects ->with incoming refs将列出该类的实例
在这里插入图片描述
with outgoing references:这个类引用到了哪些类
with incoming references:这个类被哪些类所引用

  • 找到GC Roots

快速找出某个实例没被释放的原因,可以右健Path to GC Roots–>exclue all phantom/weak/soft etc. reference
在这里插入图片描述
用这个方法可以快速找到某个对象的GC Root,一个存在GC Root的对象是不会被GC回收掉的

4.2 Leak Suspects

自动分析内存内存泄漏的原因,可以直接定位到Class和代码行数
在这里插入图片描述
深色区域被怀疑有内存泄漏,具体点开详情来找到类
在这里插入图片描述
在这里插入图片描述

4.3 Top Comsumers

通过图型列出最大的Object
在这里插入图片描述

4.4 Dominator Tree

列出线程的树结构,及线程下面对象占用内存的空间
在这里插入图片描述
Percentage:这个对象占所有对象的百分比,前面这几个对象占10%,可以知道它占内存的大部分,需要详细地进行优化这部分对象,需要看一下这些对象能不能被回收以及它为什么没有被回收
with outgoing references:这个类引用了哪些对象
with incoming references:这个类被哪些对象所引用

dominator_tree与Histogram中中这两个值的区别是:

  • dominator_tree基于实例的角度
  • historgram基于类的角度

在dominator_tree中,会将具体的对象列出来
在这里插入图片描述

4.5 thread_overview

详细地展示线程信息
在这里插入图片描述

五、分析套路

方法一

  1. 通过thread_overview,按retained head排序,展开线程,从调用栈中找到当前服务的代码
  2. 通过histogram,选择group by package,按retained head排序,找到当前服务的代码

找到最属于自己服务代码中最可疑的堆栈对象后,查询list object --> out comming,查看它里面包括了什么

方法二

直接通过dominator_tree,按retained head排序,然后看最大的线程在持有哪些大对象,还可以右键查看线程详细堆栈信息

六、dump文件

经常服务直接OOM,所以需要自动触发headdump

OOM时自动触发headdump

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/temp/heapdump.hprof

FGC前后做headdump

-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=/app/temp/
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sysu_lluozh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值