如何使用MAT进行JVM内存泄露分析

转载自  如何使用MAT进行JVM内存泄露分析

在《Java Agent的隔离实现以及卸载时一些坑》中,卸载Agent之后,使用 jmap-histo:live pid命令验证执行FGC,相关Class是否会被回收,结果遇到了一些问题,最终通过MAT内存分析才定位到了问题,本文介绍如何使用MAT进行内存泄露分析。

MAT安装

MAT是eclipse中的一个插件,不过也提供了独立的版本,在IDEA风靡的今天,建议直接使用独立版本,官网下载地址 

http://www.eclipse.org/mat/downloads.php 

根据操作系统版本下载最新的MAT

 

MAT配置

找到MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。

获取堆转储文件

1、如果想主动获取,可以使用jamp命令,对于部署到服务器上的程序可以采用这种方式,获取堆转储文件后scp到本地,然后本地分析。

  1. jmap -dump:format=b,file=<dumpfile.hprof> <pid>

2、如果想在发生内存溢出的时候自动dump,需要添加下面参数

  1. -XX:+HeapDumpOnOutOfMemoryError

MAT使用

打开MAT之后,加载dump文件,显示下面的界面。

一般用到比较多的2个功能 1、Histogram 2、Leak Suspects

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无路径可达,处于不可触及状态,垃圾回收器就可以回收了。

Leak Suspects

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

 

然后接着,是问题一的描述,列出了一些比较大的实例。

 

点击Details可以看到细节信息

 

点开Details进入详情页面,在详情页面Shortest Paths To the Accumulation Point表示GC root到内存消耗聚集点的最短路径,如果某个内存消耗聚集点有路径到达GC root,则该内存消耗聚集点不会被当做垃圾被回收。

内存快照对比

为了有效的找出内存泄露的对象,一般会获取两个堆转储文件(先dump一个,隔段时间再dump一个),并同时打开两个dump文件。

打开其中一个Histogram,然后点击下面按钮。

 

选择另外一个需要对比的dump文件

 

 

通过对比结果可以方便的看出对象的变化情况,并快速定位问题。

 

还不会使用的MAT的同学,赶紧学起来,机会都是留给有准备的人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ribbon 客户端负载均衡

文章目录零、懒汉式改为饿汉式一、基于配置文件二、基于Bean配置三、自定义规则1 权重优先调用2 集群优先调用3 元数据优先调用零、懒汉式改为饿汉式 【consumer-springboot-80子模块】 Ribbon默认使用懒汉式加载服务列表&#xff0c;更改为懒汉式 application.yml ribbon: …

jzoj1503-体育场【带权并查集】

正题 大意 一个圆形300米的操场&#xff0c;外面位置无数排的椅子&#xff0c;然后给出一些条件&#xff0c;形式为&#xff1a; A B x ABx意思为A在B的顺时针方向第x个&#xff0c;求有多少个要求无法满足解题思路 用并查集&#xff0c;然后一个farfar数组表…

C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码

.NET core2.0 发布了,刺激,大致看了一下,很不错,打算后期学习.(不出意外,应该也会写个小系列). 虽然官方推荐用共享类库创建新的类库..然而我这个Demo还是使用的可移植.. 嗯..解释一下 为什么暂时没用共享类库.. 有些小BUG 可能是为了迎合其他类型的项目..所以在共享类库里创…

“老师,我不要苹果味的,我要葡萄味的”!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。题库四班目前题库正在维护中&#xff0c;工作量最大的莫过于题库里面的题量了&#xff0c;所以目前的解决方法是让动员大家一起出题&#xff0c;但是人多较杂&#xff0c;各种各样的题都有&#xff08;…

一次频繁Full GC的排查过程,根源居然是它...

转载自 一次频繁Full GC的排查过程&#xff0c;根源居然是它... 业务部门的一个同事遇到个奇怪的 Full GC 问题&#xff0c;有个服务迁移到新的应用后&#xff0c;一直频繁 Full GC。新应用机器的配置是 4c 8g&#xff0c;老应用是 4c 4g&#xff0c;老应用 GC 都很正常&…

jzoj1158-荒岛野人【扩欧,gcd,同余方程】

正题 大意 有n个野人&#xff0c;每个野人有一个初始山洞CiCi&#xff0c;每次向前移动距离PiPi&#xff0c;寿命LiLi&#xff0c;如果野人走到了最后一个山洞那么继续就好回到第一个山洞&#xff0c;求至少多少个山洞才可以让野人们不会发生冲突。 解题思路 我们可以枚举答…

.NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

今天所有开发环境已经迁移到mac OS下的Visual Studio Code 命令行编译发布&#xff0c;而运行服务器是CentOS7&#xff0c;和windows没什么关联了。 只要你Relese编译并在本地有一个与服务器相同的运行环境中运行成功了&#xff0c;迁移到真实服务器不会有什么难度。 下面是迁…

“老师,我写着写着就 强制交卷了……”

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。01暴露出的问题

蚂蚁金服的一次面试经历(一面、二面)

转载自 蚂蚁金服的一次面试经历&#xff08;一面、二面&#xff09; 一次有把握的面试&#xff0c;需要经过长时间的准备 电话一面 1、自我介绍、自己做的项目和技术领域 2、项目中的监控&#xff1a;那个监控指标常见的有哪些&#xff1f; 3、微服务涉及到的技术以及需要…

Mybatis案例

1、【microboot项目】修改配置文件&#xff0c;引入所需要的相关依赖库: ext.versions [ // 定义所有要使用的版本号springboot : 2.4.3, // SpringBoot版本号junit : 5.7.1, // 配置JUnit测试工具的版本编号juni…

jzoj1161-机器人M号【欧拉函数,dp】

正题 大意 因为题目比较gou&#xff0c;所以就直接放题目了 机器人1号可以制造其他的机器人。 第2秒&#xff0c;机器人1号造出了第一个机器人——机器人2号。 第3秒&#xff0c;机器人1号造出了另一个机器人——机器人3号。 之后每一秒&#xff0c;机器人1号都可以造出一个新…

张老师讲Python~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。最近我的个人站上线啦&#xff0c;欢迎大家访问http://穆雄雄.com&#xff1b;或者点击文末的“阅读原文”。昨天下午靳老师分享了关于网站部署的内容&#xff0c;今天下午请张炜林上去分享了下他准…

Entity Framework Core 2.0 新特性

一.模型级查询过滤器&#xff08;Model-level query filters&#xff09; ef core2.0包含了一个新特性&#xff0c;我们叫他模型级查询过滤器&#xff08;Model-level query filters&#xff09;。此特性允许使用Linq查询表达式直接定义在实体类型的元数据模型上。这样的过滤器…

SpringCache与Redis

文章目录SpringCache简介常⽤注解Cacheable自定义CacheManager配置和过期时间自定义缓存KeyGenerator常用注解CachePut 和 CacheEvict多注解组合CachingSpringCache简介 ⽂档&#xff1a;https://spring.io/guides/gs/caching/ ⾃Spring 3.1起&#xff0c;提供了类似于Transact…

激动的时刻,终于成啦~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;【雄雄的小课堂】。今天&#xff0c;最令我激动的一件事莫过于倾注一周精力的“在线测试”终于可以投入使用了&#xff0c;周二发过一篇文章&#xff0c;是关于在线测试的问题总结&#xff0c;也就是在周二&a…

C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码

今天的学习内容? 今天我们讲讲Xamarin中的MVVM双向绑定,嗯..需要有一定的MVVM基础.,具体什么是MVVM - -,请百度,我就不多讲了 效果如下: 正文 1.简单的入门Demo 这个时间的功能很简单,就是一个时间的动态显示. 我们首先创建一个基础的页面如下: <?xml version"…

由「Metaspace容量不足触发CMS GC」从而引发的思考

转载自 由「Metaspace容量不足触发CMS GC」从而引发的思考 某天早上&#xff0c;毛老师在群里问「cat 上怎么看 gc」。 好好的一个群 看到有 GC 的问题&#xff0c;立马做出小鸡搓手状。 之后毛老师发来一张图。 老年代内存占用情况 图片展示了老年代内存占用情况。 第一个…

P1040,jzoj1167-加分二叉树【树形dp】

前言 没有SPJ坑了我好久qwq 正题 测试连接&#xff1a;https://www.luogu.org/recordnew/lists?uid52918&pidP1040 大意 一颗二叉树的中序遍历是1,2,3...n−2,n−1,n1,2,3...n−2,n−1,n然后给出每个点的值aiai&#xff0c;每个点的分数是 sislsonsrsonaisislsonsrsona…

是现在的钱不值钱还是药太贵!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。莫名其妙的就感觉身体不舒服&#xff0c;然后越来越严重&#xff0c;打小以来还是第一次遇见这样的&#xff0c;你说是感冒吧&#xff0c;它也不流鼻涕&#xff0c;喉咙也不痛&#xff0c;鼻子也通…

P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)

#正题 评测记录&#xff1a; https://www.luogu.org/recordnew/show/8283818 大意 两个币值&#xff08;互质正整数&#xff09;&#xff0c;求不能完全&#xff08;需要找零&#xff09;的最贵的东西。 解题思路 首先众所周知axbyc而且a和b互质的正整数&#xff0c;c为正整数…