MAT

MAT:全称(Eclipse Memory Analyzer)内存分析工具
下载地址:https://www.eclipse.org/mat/downloads.php (免费的)

mat下载

可根据自己系统进行下载,windows / mac / linux都有,下载完毕解压即可,不需要安装。

双击 MemoryAnalyzer.exe 打开:


MemoryAnalyzer.exe

打开之后,点击 file 打开对应的 dump 文件即可。注意:打开时如果没有看到dump文件,则在下面文件名选择all files即可。
导入dump文件后,选择第一个Leak Suspects Report(泄漏嫌疑报告),后点击finish

image.png

接下来这个图片说的是内存泄露的情况,并且指出了导致内存泄露的代码。一般情况下都是因为内存泄露导致的内存溢出。overview界面会以饼图的方式显示当前消耗内存最多的几类对象,可以使我们对当前内存消耗有一个直观的印象。但是,除非你的程序内存泄漏特别明显或者你正好在生成hprof文件之前复现了程序的内存泄漏场景,你才可能通过这个界面猜到程序出问题的地方。(下图就是正好在生成hprof文件之前复现了程序的内存泄漏场景,嘿嘿~)

解决内存溢出的思路:
占用内存过大的对象有哪些?
这些对象被谁引用?
定位到具体的代码

image.png

下图深色部分可以看到,problem suspect占比310M,可以先从这里下手去看,点击下面的details进入
image.png

下图可以看到有个ArrayList new出来的对象 一直往IdleConnectionReaper里面塞


图6

通过上面IdleConnectionReaper查找代码发现,getosssign方法使用完后没有调用client.shuntdown方法导致。和网友的一篇文章类似:https://www.cnblogs.com/dcz2015/p/15947137.html,到此问题就已经解决,但是,如果还有其他问题,可以根据Dorminator Tree(支配树)分析。
下面先了解2个概念:
shallow heap:指的是某一个对象所占内存大小。
retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。
同样按照图6的方法展开查询调用路径。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容