安卓内存泄露工具使用
关于是什么内存泄露,为什么会内存泄露,这里就先不提了,下面只说对于内存泄露我们可以用什么工具来检测。
使用开源工具
安卓开发应该都非常熟悉了, LeakCanary。
开源地址:
https://github.com/square/leakcanary/
集成到自己的项目中,直接在 UI 中就能够查看了,非常的简单明了,不做赘述。
使用 MAT 分析
MAT 是重头戏,在一些时候, LeakCanary 是不能够完全准确实时的反应出内存的使用以及泄露情况,所以就需要用的专业的工具。
MAT 是 Memory Analyzer的简称,它是一款功能强大的 Java 堆内存分析器。可以用于查找内存泄露以及查看内存消耗情况。MAT 是基于 Eclipse 开发的,是一款免费的性能分析工具。
首先如果不想下载 Eclipse ,可以下载 MAT 的单独版本,地址是 https://www.eclipse.org/mat/downloads.php ,选择对应系统下载即可。
在 mac 系统下使用可能会出现下面的问题:

到提示的目录下看看 log 文件:

打开文件:

原因就是那个 .metadata 文件不能被写入,需要在 MemoryAnalyzer.ini 文件中加入参数,
1.在安装包上右键显示包内容
2.进入 mat 文件夹,找到 MemoryAnalyzer.ini
输入
-data
/Users/自己的用户名/mat-log
注意事项:
data 参数和路径必须在两个不同的行
data 参数必须放在 Laucher 之前
成功打开之后,页面如下:

此时我们需要在 Android Studio 中导出一段时间 Dump 的 hprof 文件,在 Android Studio 3.0 版本前后,导出的步骤略有不同,这里我用的是 3.3.2 的版本。

点击之后 as 下半部分 ui 会开始实时分析该设备的 CPU 内存网络等情况,点击内存那栏:

进入内存分析的详细页面,点击上面的下载按钮开始记录:

此时 as 会开始记录,随后我们右键被记录的那段内存记录,选择导出:

将文件拖到 mat 应用中,选择内存泄露分析:

发现报错了:

这是因为 mat 主要是用来分析 java 的,而 android 的虚拟机导出的内存文件hprof 文件格式与标准的 java hprof 文件格式标准不一样,根本原因两者的虚拟机不一致导致的。可以通过 sdk 自带的命令行转换格式:
hprof-conv 源文件 目标文件
例如:

此时用 mat 打开导出到桌面的文件:

到此,终于可以开始分析安卓应用详细的内存使用情况了。
下篇文章将结合具体案例,分析应用是否存在内存泄露,以及应该如何定位。