在之前的博文中介绍了Android 性能分析工具TraceView 及Systrace。本文介绍两个内存分析工具Heap 及MAT。在应用开发过程中,无论多小心都不可避免会出现内存使用上的问题导致内存泄露。通过一些调试工具来检测内存使用情况是很有必要的,相信本文介绍的两款工具能给大家带来帮助。
一、Heap
Android tools中的DDMS就带有一个很不错的内存监测工具Heap,通过使用eclipse的ADT插件可以很方便地用Heap监测应用进程使用内存情况,步骤如下:
1. adb 登陆到调试设备
2. 启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的
3. 在Devices 视图中选中调试设备,并点击需要检测的进程,如图1中的com.hybroad.launcher
4. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标
启动后Heap 视图如下:
图1: Heap视图
通过Heap视图可以检测进程内存使用情况,看是否存在内存泄露。
1. 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;
2. 应用程序执行过程中,如果存在内存使用变化,Heap视图会定时刷新,通过Total size可以反应出内存整体使用情况
Heap 视图中有一个叫做data object,即数据对象,这个数据对象就是我们程序中存在的类的类型对象,通过检视data object的Total size,来查看我们的程序是否存在内存泄露。通常情况下,Total size会稳定在一个稳定的范围内,如果程序代码良好,不存在对象无法回收造成内存泄露,那Total size会在一个稳定的范围内。如果代码中存在没有释放的对象引用,则data object的Total size会不断地增加,每次GC都无法保证内存使用值回落。通过检测data object的Total size 可以很方便的检测代码是否存在内存泄露的可能性。
二、MAT(Memory Analyzer Tool)
Heap只能检测代码是否存在内存泄露的可能性,但要找到具体哪里泄露还需要借助MAT。 MAT是一个Eclipse插件,可以通过官方下载,eclipse插件下载这里不做介绍。安装MAT插件以后,eclipse自动生成的.hprof文件可自动生成分析视图,如图2所示:
图2:MAT使用
如图2显示,启动MAT同样需要选择检测进程,点击Devices上的Dump HPROF file 可以生成.hprof 文件,MAT工具分析该文件得到右边视图。在右图饼型图中。有三块深色的颜色表示可能存在的内存泄露。点击Leak Suspects,可以看到存在三个bitmap使用隐患,其中两张图片分别占7.9M。点击Leak Suspects显示结果如下,可以从中找到使用对应bitmap的位置,如图3所示,给出了其中一处隐患的路径。
图3:存在隐患的路径列表
MAT工具的使用,具体查看官网。