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文件,并存储在手机本地文件夹。这样非常方便复查。