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


1、打开DDMS

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

android dump 分析工具 dump查看器 安卓_内存泄露

3、查看Heap情况

android dump 分析工具 dump查看器 安卓_Android_02

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

android dump 分析工具 dump查看器 安卓_Android_03

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


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

android dump 分析工具 dump查看器 安卓_android_04

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(){St

ring 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内存泄漏简介
》在内存中查找内存泄露的原因并解决。