android内存泄漏的检测

669 阅读2分钟

1. 使用leakCanary生成内存泄漏文件

LeakCanary官方文档

dependencies { // debugImplementation because LeakCanary should only run in debug builds. debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' }

LeakCanary会直接生成hprof文件,比android-studioprofile感觉要方便的多,并且hprof是保存在手机存储空间里的,方便复查。在手机存储空间的Download\leakcanary-packagename目录下可以查看到对应的hprof文件。如下图: image.png

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命令。如下图:

image.png

点击打开mat可能需要jdk11+)。

在右上角选择file->Open Heap Dump,打开#2.2中转换后的的new-hprof.hprof文件。 如下图:

image.png

点击右下角Actions-Histogram查看。

image.png

<Regex>这个地方输入我们想要查看的可能会有内存泄漏的Activity或者Fragment的名字。

image.png

选中其中一个,右键选择Merge Shortest Paths to GC Roots ,然后选择exclude all phantom/weak/soft etc. references过滤掉软弱虚引用对象。因为只有被强引用的对象未被及时释放才会引起内存泄漏。

image.png

这样就可以清楚的看到是哪个地方会有内存泄漏了。当然如果没有内存泄漏,这里就什么都没有了。

image.png

3 总结

整个流程差不多就是这样。使用android-studioprofile分析内存泄漏的话,对于个别手机,当打开android-studioprofile后,几秒内APP就闪退,非常不方便。而LeakCanary可以将内存分析数据保存到hprof文件,并存储在手机本地文件夹。这样非常方便复查。