1. 使用leakCanary生成内存泄漏文件
dependencies { // debugImplementation because LeakCanary should only run in debug builds. debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' }
LeakCanary
会直接生成hprof文件,比android-studio
的profile
感觉要方便的多,并且hprof
是保存在手机存储空间里的,方便复查。在手机存储空间的Download\leakcanary-packagename
目录下可以查看到对应的hprof
文件。如下图:
2. 使用eclipse-mat查看hprof文件
2.1 下载eclipse-mat
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
下载后解压即可。
2.2 配置hprof命令到系统环境变量并转换hprof文件
将android-sdk\platform-tools
添加到系统环境变量path
中。该目录下有个命令hprof-conv.exe
,用于转换hprof
文件。
比如:转换#1
中的2021-08-04_14-23-17_182.hprof
,生成新的new-hprof.hprof
。
hprof-conv -z 2021-08-04_14-23-17_182.hprof new-hprof.hprof
如果不做这一步转换,mat
导入hprof
文件时会报错,无法分析文件内容。
2.3 分析hprof文件
在mat
目录下可以看到MemoryAnalyzer.exe
命令。如下图:
点击打开mat
(可能需要jdk11+)。
在右上角选择file->Open Heap Dump
,打开#2.2
中转换后的的new-hprof.hprof
文件。
如下图:
点击右下角Actions-Histogram
查看。
在<Regex>
这个地方输入我们想要查看的可能会有内存泄漏的Activity
或者Fragment
的名字。
选中其中一个,右键选择Merge Shortest Paths to GC Roots
,然后选择exclude all phantom/weak/soft etc. references
过滤掉软弱虚引用对象。因为只有被强引用的对象未被及时释放才会引起内存泄漏。
这样就可以清楚的看到是哪个地方会有内存泄漏了。当然如果没有内存泄漏,这里就什么都没有了。
3 总结
整个流程差不多就是这样。使用android-studio
的profile
分析内存泄漏的话,对于个别手机,当打开android-studio
的profile
后,几秒内APP
就闪退,非常不方便。而LeakCanary
可以将内存分析数据保存到hprof
文件,并存储在手机本地文件夹。这样非常方便复查。