理论教育 检测Android应用程序的内存泄漏方法

检测Android应用程序的内存泄漏方法

时间:2023-06-19 理论教育 版权反馈
【摘要】:在日常应用中,通常有如下三种查看Android内存泄露的方法。到此为止,.hprof文件处理完毕,此时就可以用来分析内存泄露情况了。目前查看内存,分析内存泄露还有以下几种方法。

检测Android应用程序的内存泄漏方法

在日常应用中,通常有如下三种查看Android内存泄露的方法。

1.生成.hprof文件

生成.hprof文件的方法有很多,而且Android的不同版本中生成.hprof的方式也稍有差别,各个版本中生成.prof文件的方法请参考如下官方网址:

下面以2.1版本为例,具体生成流程如下所示。

(1)打开Eclipse,切换到DDMS透视图,同时确认已经打开了Devices、Heap和logcat视图。

(2)将手机设备连接到电脑,并确保使用“USB调试”模式连接,而不是“Mass Storage”模式。

(3)当连接成功后,在Devices视图中就会看到设备的序列号,和设备中正在运行的部分进程。

(4)单击选中想要分析的应用的进程,在Devices视图上方的一行图标按钮中,同时选中“Update Heap”和“Dump HPROF file”两个按钮。

(5)这时DDMS工具将会自动生成当前选中进程的.hprof文件,并将其进行转换后存放在sdcard当中,如果已经安装了MAT插件,那么此时MAT将会自动被启用,并开始对.hprof文件进行分析。

在上述流程中,第4步和第5步能够正常使用前提是有sdcard,并且当前进程有向sdcard中写入的权限(WRITE_EXTERNAL_STORAGE),否则不会生成.hprof文件。在logcat中会显示下面的信息:

如果没有sdcard,或者当前进程没有向sdcard写入的权限(如system_process),那可以进行如下的第6步操作。

(6)在当前程序中,例如在Framework(框架)中的某些代码中,可以使用android.os.Debug中的如下方法手动的指定.hprof文件的生成位置。

例如:

上述代码的功能是,希望在某个按钮被单击的时候开始抓取内存使用信息,并保存在指定的位置:/data/temp/myapp.hprof,这样就没有权限的限制了,而且也无须用sdcard。但是这样做的前提是要保证/data/temp目录是存在的。这个路径可以自己定义,当然也可以写成sdcard当中的某个路径。

2.使用MAT导入.hprof文件

如果是Eclipse自动生成的.hprof文件,则可以使用MAT插件(在后面将讲解这个插件)直接打开(可能是比较新的ADT才支持)。如果Eclipse自动生成的.hprof文件不能被MAT直接打开,或者是使用android.os.Debug.dumpHprofData()方法手动生成的.hprof文件,则需要将.hprof文件进行转换。为了讲解具体的转换方法,编者举一个例子,例如将.hprof文件复制到PC上的“/ANDROID_SDK/tools”目录下,并输入命令“hprofconv xxx.hprof yyy.hprof”,其中xxx.hprof表示原始文件,yyy.hprof为转换过后的文件。转换过后的文件自动放在“/ANDROID_SDK/tools”目录下。到此为止,.hprof文件处理完毕,此时就可以用来分析内存泄露情况了。(www.daowen.com)

在Eclipse中依次单击“Windows”→“Open Perspective”→“Other”→“Memory Analyzer”,或者打Memory Analyzer Tool的RPC。在MAT中单击“File”→“Open File”,浏览并导入刚刚转换而得到的.hprof文件。

3.使用MAT的视图工具分析内存

导入.hprof文件以后,MAT会自动解析并生成报告,单击“Dominator Tree”,并按照Package分组,选择自己所定义的Package类然后单击右键,在弹出的菜单中依次选择“List objects”→“With incoming references”。这时会列出所有可疑类,右击某一项,并依次选择“Path to GC Roots”→“exclude weak/soft references”,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。

具体的分析方法在此不做说明了,因为在MAT的官方网站和客户端的帮助文档中有十分详尽的介绍。了解MAT中各个视图的作用很重要,可以参照www.eclipse.org/mat/about/screenshots.php中的介绍。

总之使用MAT分析内存查找内存泄漏的根本思路,就是找到哪个类的对象的引用没有被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。

另外在测试过程中,首先需要分析怎么样操作一个应用会产生内存泄露,然后在不断的操作中抓取该进程产生的.hprof文件,使用MAT工具进行分析。目前查看内存,分析内存泄露还有以下几种方法。

(1)使用top命令查看某个进程的内存。例如创建一个脚本文件music.sh,该文件的内容是指定程序每隔一秒钟输出某个进程的内存使用情况,在此具体实现如下:

并且配合使用procank工具,可以查看music进程每一秒钟内存使用情况。

(2)另外使用top命令也可以查看内存,具体为:

(3)free命令

free命令用来显示内存的使用情况,使用权限是所有用户。格式如下:

参数-b/-k/-m:表示分别以字节(KB、MB)为单位显示内存使用情况。

参数-s delay:显示每隔多少秒来显示一次内存使用情况。

参数-t:显示内存总和列。

参数-o:不显示缓冲区调节列。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈