Android内存测试工作原理:
Android程序中每个元素都是以对象的形式存在于内存中,通过抓取进程的内存快照并分析对象结构得到内存测试的结果
内存常见问题:
1.使用过的对象没有及时释放,常驻内存中,导致内存占用过多
2.对象重复缓存
3.对象(内存)泄露导致内存持续增长
4.使用未经压缩处理的资源文件,这些文件载入内存直接占用大量的内存
以上几点最直观的结果就是进程占用更多的内存
在android系统中,内存占用越高可能导致以下问题
1.android系统的内存heapsize限制,超过heapsize进程会出现OOM,这在一些比较老的手机中经常出现
2.android系统在内存资源缺乏时会对进程的内存进行回收,导致系统不稳定(手机中同时开启多个应用,一些进程从后台切前台的时候activity会重新加载)
3.内存占用过多系统会频繁的alloc和gc内存,alloc和gc内存会占用cpu资源,直观结果是系统卡顿耗电量增加
Android内存测试工具
DDMS MAT
Android内存测试环境
Debug版的android程序(debug版的程序才能在DDMS中抓取内存快照)
Android内存测试步骤
以导航首页为例进行一次内存分析
1.连接手机进入导航首页,打开DDMS在进程列表中找到com.baidu.navi这个进程并选中之后点击update heap按钮

2.等导航稳定后,在DDMS heap列表点击cause gc按钮(这一步一定不能少)

3.点击device栏的dump hprof file按钮抓取内存快照,过一段时间后就会生成一份内存快照文件

Histogram :list number of instances perclass列出每个类的实例
Dominator Tree: biggest objects and what they keep alive这里是会列出内存中最大的对象
4.直接点击Dominator Tree

可以看到占用内存最大的依次排列出来
Android.content.res.Resources就是android程序的资源文件在进程中的映射(可以看出对资源文件进行优化处理也是可以减小进程内存占用的这里以后再说)
Com.baidu.navi.pluginframework.logic.drawable.ResDrawable这个是我们自定义的对象,占用了9.53%的内存这个要引起关注
5.点击Com.baidu.navi.pluginframework.logic.drawable.ResDrawable查看ResDrawable具体是什么内容占用了这么大的内存

这里看到imagecache对象占用了大量的内存
6.继续看imagecache结构

看到是imagecache对象的成员变量bitmap占用了大量的内存
定位到问题之后就可以查看源码了

最终通过引用关系可以看到这里的两个bitmap对象就是在选择导航模式SelectModeFragment时使用的,这两个bitmap在进入导航首页后是不需要再次使用的了,因此进入导航首页后就可以回收掉

回收前


回收后


为什么native内存也会减少
