目标:该系列文章带领大家掌握android内存溢出的排查,让内存问题不再是android开发者的门槛。
DDMS(Dalvik Debug Monitor Server)和MAT(Memory Analyzer Tool)这两个工具可以很好地帮助我们分析优化内存。MAT是一个Eclipse插件,同时也有单独的RCP客户端。我们使用MAT的eclipse插件,使用插件要比RCP稍微方便一些。插件地址为http://download.eclipse.org/mat/1.5/update-site/,安装方式跟ADT,SVN插件方式一致。

一,MAT的使用
1) 手机连接电脑,点击eclipse DDMS视图,选择Devices视图,确认手机在Devices列表中。
2 在手机上打开应用,运行至需要分析内存的界面,在Devices中对应手机下选中该应用对应的包名,比如com.tencent.kupaodemo,先后点击如下图:

3)点击步骤2)中的2之后稍等数秒,如果已成功安装MAT,便会自动打开hprof文件,进入以下界面:

上图我们最常用的两个MAT功能是:Histogram(直方图)列举了每个对象的统计,Dominator Tree(支配树)提供了程序中最占内存的对象的排列。
二,MAT工具的介绍
1)点击Dominator Tree,显示如下界面:

Dominator Tree可以列出分配的所有对像。
下面认识一下上图红框标注的几个名词含义:
Shallow Heap:指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小。单位为byte。
Retained Heap:前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)。换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。单位为byte。
在JAVA中是通过可达性(Reachability Analysis)来判断对象是否存活,这个算法的基本思想是通过一系列的称谓”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走的路径称为引用链,当一个对象到GC Roots没有任何引用链相连则该对象被判定为可以被回收的对象,反之不能被回收。
右键点击某个对像,点Path to GC root->exclude weak/soft reference. 可以列出这个对像到GC root的路径。如下图所示:

下图显示这个NinePatch(点九图片)对象到GC-root的路径

2)点击Histogram,显示如下界面:

Histogam可以列出程序涉及的所有class。
Histogram视图,以class为分类进行统计,并统计每个class分配了多少对象,占用的shallow size和retain size。
右键点击某一个类-> list objects可以列出这个类生成的所有对象。如下图:

with outgoing reference表示,把此对象引用的对象也显示出来。
with incoming referentce 表示,把引用此对象的对象也显示出来。
3)Group by…
在historgam和dominator tree视图中,可以点击菜单栏的“Group by..”按钮。可以将对像以四种方式分类1.Group by class,实际上就是Hisgtoram视图。
2.Group By class loader 其中在Group By class loader中。会按照class loader进行分类。
3.GroupByPackage
在Group By Package中。可以将类以包名组积显示,结构和我们写程序时看到的Package Explorer相似。如下图所示。在这个视图中,可以很方便的根据我们熟悉的Package explorer找到相关的类。

更多相关文章

  1. Android中String资源文件的format方法
  2. Android(安卓)开发必读:如何成为一名优秀的Android开发者
  3. Android服务注册完整过程源码分析
  4. Android横竖屏布局总结
  5. android EditText彻底搞定输入框隐藏/显示背景 可编辑输入问题
  6. Android(安卓)使用Parcelable传递对象
  7. Android开发指南-三维图形
  8. Android-sharedUserId数据权限 android:sharedUserId
  9. android事件拦截处理机制详解

随机推荐

  1. Android---进程间通机制的简单理解
  2. Android(安卓)XML布局报错:android/view/V
  3. Android中的界面组成
  4. 【基于Android的ARM汇编语言系列】之六:NE
  5. Android(安卓)Opencore
  6. Android-在应用中使用拖拽教程
  7. Android中Java与web通信
  8. android的技术层次
  9. Afinal 是一个android的sqlite orm 和 io
  10. Android知识点回顾