【调优工具】MAT内存分析工具
2021/12/8 7:20:25
本文主要是介绍【调优工具】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 具体信息
具体信息
- Class Name : 类名称,java类名
- Objects : 类的对象的数量,这个对象被创建了多少个
- Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
- 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
详细地展示线程信息
五、分析套路
方法一
- 通过thread_overview,按retained head排序,展开线程,从调用栈中找到当前服务的代码
- 通过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/
这篇关于【调优工具】MAT内存分析工具的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07如何利用看板工具优化品牌内容创作与审批,确保按时发布?
- 2025-01-07百万架构师第十一课:源码分析:Spring 源码分析:Spring源码分析前篇|JavaGuide
- 2025-01-07质量检测标准严苛,这 6 款办公软件达标了吗?
- 2025-01-07提升品牌活动管理的效率:看板工具助力品牌活动日历的可视化管理
- 2025-01-07宠物商场的精准营销秘籍:揭秘看板软件的力量
- 2025-01-07“30了,资深骑手” | 程序员能有什么好出路?
- 2025-01-07宠物公园的营销秘籍:看板软件如何帮你精准触达目标客户?
- 2025-01-07从任务分解到资源优化:甘特图工具全解析
- 2025-01-07企业升级必备指南:从传统办公软件到SaaS工具的转型攻略
- 2025-01-07一文告诉你IT项目管理如何做到高效