MAT内存分析工具介绍
生成了hprof文件后,然后就是使用Memory Analyzer。 官网下载地址:www.eclipse.org/mat/downloa…,因为捐赠什么的,不建议。我这找到了一个比较靠谱的版本,csdn下载
下载好后启动我们的MemoryAnalyzer.exe。File --> Open Heap Dump打开我们的my.hprof文件如图:
先简单介绍下Memory Analyzer的信息。
2.1.1、红色框1: OverView大概信息
- Size 内存大小
- Classes : class对象
- Objects : Objects个数,也就是实例个数
- Unreachable Objects Histogram :可被回收的对象,扔在内存当中
2.1.2、红色框2: Histogram直方图
- Objects: 这个类有多少个实例
- Shallow Heap: 单个实例占用的内存
- Retained Heap: 单个实例及其引用一共占有多少内存
我们可以利用直方图,里的Regex搜索我们最开始的内存泄漏案例。搜索BitmapActivity如图,可以看到我们的BitmapActivity有3个实例:
我们可以右键点击com.leo.me,oryanalyzertest.BitmapActivity --> List objects --> with incoming reference (谁引用了我),如图可以看到有3个地方引用了BitmapActivity:
此时我们右键一个实例点击 Path To GC Roots --> with all refrence,如图,找到文件下带小太阳的文件,可能触发内存溢出的地方。这里是说我们的sCallBacks引用了,也证实了在我们内存泄漏代码里的CallBackManager里的静态集合sCallBacks添加了它。
2.1.3、红色框3:dominator tree展示每个实例的内存和所占比例
可以看到我们这里的大头是bitmap。
同样我们可以通过右键一个实例Path To GC Roots --> with all refrence如图,也能看到是我们的sCallBacks引用了:
2.1.4、红色框4:OQL,类似于数据库搜索我们的内存情况
写入命令后,点击红色感叹号运行,如图
2.1.5、红色框5:thread overview,展示线程情况
2.1.6、红色框6:Top Consumers (重点),直接展示出我们内存中的大内存
展示我们内存中占有比较大的内存,可以看到这里都是被3个大bitmap占据着。直观利于分析
2.1.7、红色框7:Leak Suspects(重点),直接给出分析,分析出我们代码中可能会出现内存泄漏的地方
这里我启动了3次BitmapActivity,它也给了我3个分析。点击details。看详情,也直接把问题定在了sCallBacks中:
作者:岩浆李的游鱼leo2
链接:https://juejin.im/post/6844904151936155656
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。