您的位置:首页 > 移动开发 > Android开发

Android】开发优化之——调优工具:dump hprof file 查看内存情况,找到内存泄露,androidhprof

2016-04-08 12:05 330 查看
虽说知道一般性的开发android应用需要注意的问题,可是也有水平参差不齐的情况,特别是维护代码,如果内存占用大,内存溢出严重,又怎么解决呢? -- 通过DDMS把heap抓出来分析

1、打开DDMS



2、选中需要查看的程序,并且点击Update Heap图标





3、查看Heap情况





但是这仅仅是查看一下Heap的使用情况,那如果发现内存占用或者溢出很严重,动不动就OOM了。通过这个是看不出啥东西的,这个时候就需要把Heap抓出来分析,在UpdateHeap边上还有一个按钮。





点一下,会生成一个文件,随便保存起来(会有点延时,耐心等等喔,我保存到桌面)

7、查看刚刚下载的文件,不过要查看之前我们需要 MAT





8、安装MAT ,步骤基本上网上都有,方法为:eclipse-》help-》Eclipse Marketplace-》选择Memory Analysis 右边的install 然后下一步 下一步安装即可。

9、.hprof文件转换,由DDMS直接保存的文件不能用MAT查看,会提示格式不正确。这个时候要使用sdk带的工具 hprof-conv来进行转换。

C:\Users\Administrator>hprof-conv C:\Users\Administrator\Desktop\test.hprof C:\Users\Administrator\Desktop\hprofed-test.phrof


10、使用MAT打开.hprof文件查看内存使用情况。

至于MAT怎么用 百度或者谷歌还是很多的,或者等我研究到对android有价值的东西,我会再开一个博文说明的!

使用android MAT查看内存泄露问题,我查看了很多资料,为何在DDMS中没有hprof文件?

如何用MAT来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse:

1.打开Eclipse

2.选择 Help->Install New Software;

3.在Work with中添加站点:download.eclipse.org/mat/1.0/update-site/(这个地址可能会变化,但是新的地址可以在官方网站上找到:www.eclipse.org/mat/downloads.php )

4.生成.hprof文件:插入SD卡(Android机器很多程序都需要插入SD卡),并将设备连接到PC,在Eclipse中的DDMS中选择要测试的进程,然后点击Update Heap 和Dump HPROF file两个Button。

.hprof 文件会自动保存在SD卡上,把 .hprof 文件拷贝到PC上的\ android-sdk-windows\tools目录下。这个由DDMS生成的文件不能直接在MAT打开,需要转换。

运行cmd打开命令行,cd到\ android-sdk-windows\tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文件,yyyyy.hprof为转换过后的文件。转换过后的文件自动放在android-sdk-windows\tools 目录下。

OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。

5.打开MAT:

在Eclipse中点击Windows->Open Perspective->Other->Memory Analysis

6.导入.hprof文件

在MAT中点击 File->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。

这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots->exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。

Android中怎查找内存泄露

1、首先确定是否有内存泄露及哪个程序造成。

1.1、内存泄露已弹出out of memory对话框的情况。

这种情况很简单,直接看对话框就知道是哪个应用的问题了。然后再分析该应用是否是因为内存泄露造成的

out of memory对话框。

》中介绍的各种方法进行分析,确定是否有内存泄露以及是哪个进程造成的内存泄露。

2、生成hprof文件,用MAT进行分析。

生成hprof文件可以在DDMS选中进程点击窗口左上角的dump hprof file按钮来直接生成,也可以通过在程序加代码中来生成代码2:voidgenerateHprof(){String packageName=getApplicationInfo().packageName;

StringhpFilePath=/data/data/+packageName+/input.hprof;try{//Debug.dumpHprofData(/sdcard/input.hprof);Debug.

dumpHprofData

(hpFilePath);}catch(IOException e) {//TODOAuto-generated catch block

e.printStackTrace();}}建议使用代码生成hprof,然后使用《

Android内存泄露利器(hprof篇)》中的工具自动提取多个hprof文件,然后用MAT进行比较分析。在MAT导入.hprof文件以后,

MAT会自动解析并生成报告,点击

Dominator Tree

,并按Package分组,选择自己所定义的Package类,比较各个类在不同时期的RetainedHeap

,找出可疑类,然后选择该类,点右键,选中

show retained Set项,参看Retained Heap

的详细信息,进一步找出嫌疑项。

3、在代码中查找内存泄露。

根据在MAT找到的内存泄露信息,参照《

Android内存泄漏简介

》进一步在内存中查找内存泄露的原因并解决。

另外如果代码很简单,可以直接参照《

Android内存泄漏简介

》在内存中查找内存泄露的原因并解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: