Profiler+MAT android内存泄漏分析定位

1.打开Android studio中的Profiler 选择自己的包进程
Profiler+MAT android内存泄漏分析定位
2.选择Memory,点击按钮生成dump,然后将dump文件导出
Profiler+MAT android内存泄漏分析定位
3.导出的.hprof格式文件不能直接用MAT软件打开分析,需要先用android sdk中的hprof-conv.exe软件格式化一下才能打开
Profiler+MAT android内存泄漏分析定位
E:\Sdk\platform-tools> hprof-conv.exe 源文件地址 输出地址
Profiler+MAT android内存泄漏分析定位
4.使用MAT(Memory Analyer)打开转换后的.hprof文件
File->Open heap dump…
根据提示点击finish
Profiler+MAT android内存泄漏分析定位

开始排查

点击histogram ,在Class Name这一栏输入你要过滤的类名,回车
Profiler+MAT android内存泄漏分析定位
搜索类名的结果 ,发现这个类有13个对象 ,正常情况找个类只有一个对象,所以这个类泄漏了
Profiler+MAT android内存泄漏分析定位
继续查找是谁使用了这个类 ,一直持有这个类的对象,导致无法释放
第一步: 排除需引用
Profiler+MAT android内存泄漏分析定位
第二步:找到被谁持有
Profiler+MAT android内存泄漏分析定位
结果
Profiler+MAT android内存泄漏分析定位
找到泄漏原因
Profiler+MAT android内存泄漏分析定位
Profiler+MAT android内存泄漏分析定位

结果,发现是CallBackManager类中的sCallBack持有了MemoryLeakActivity的引用
既然找到了原因 ,自己就去查看代码吧

根据包名查看

打开histogram ,根据图片步骤选择 Group by package
Profiler+MAT android内存泄漏分析定位
找到自己app包名 ,根据业务逻辑排查 ,大多数情况下一个只有一个实例 ,如果有多的怀疑是不是泄漏
Profiler+MAT android内存泄漏分析定位
Profiler+MAT android内存泄漏分析定位