Android性能之内存基础篇(二)

上一篇我们大概认识了安卓查看内存的一般方法,并对安卓内存有了一个简单的认识,这一篇我们将会对安卓内部关于内存的相关基础知识做一个总结


概要:

1.native内存和heap内存

2.安卓为什么会oom

3.low memory kill机制了解

4.学会查看ram内存以及进程内存(命令及解析)

5.开发中可以避免的问题点


1.native内存和heap内存

那么android中内存分为两块,一个是native内存,是lib层c/才++库所占用的内存;还有一个heap内存,是java实例对象的空间。
在3.0以前,bitmap是分配在native内存当中的,3.0以后都是分配在heap空间的,所以会有我们说的因为图片导致的oom现象,bitmap的优化点,后面会说到。
怎么查看native和heap内存呢,万能DDMS直接可以读到,当然命令dumpsys meminfo也是可以看到的。


2.安卓为什么会oom

首先要明白,oom和ram空闲内存是两回事,因为一个app所申请的内存是有限的,不可能一个app就占用全部的ram。
然后heapsize是分配的,可以在/system/prop.build文件看到,也可以getprop | grep 'heap'查到
这里重点关注下面几个参数:

[dalvik.vm.heapgrowthlimit]: [128m]             -----一般情况app申请的最大内存                                  
[dalvik.vm.heapmaxfree]: [8m]                      ----- GC机制相关,有文章:http://blog.csdn.net/oujunli/article/details/12649017                       
[dalvik.vm.heapminfree]: [512k]                      ----同上              
[dalvik.vm.heapsize]: [384m]                          -------最大的内存,配置文件设置android:largeheap="true"之后就可以用这个                       
[dalvik.vm.heapstartsize]: [8m]   ----起始分配内存
[dalvik.vm.heaptargetutilization]: [0.75]  -----GC相关

了解参数后,oom的原因就知道了,当超过heapgrowthlimit值,安卓系统就会oom,所以一般做内存测试要先看系统分配的最大值heapgrowthlimit或者heapsize,然后进一步
分析。


3.Low Memory Kill机制了解

这玩意是放在kernel的一个安卓特有的专用驱动,负责的是杀进程,oom负责的是进程的自杀,两者不一样的。
这个就简单了,当ram不足的时候,会触发这个机制,至于干掉哪个进程:
表面来说,进程有5个等级,更具等级优先级来干掉 前台进程>可见进程>服务进程>后台进程>空进程最后面那个越容易die
深层来说,进程等级直接反应在文件就是oom_adj的值,值越大越容易被杀,这个值可以在/proc/[pid]/oom_adj看到,注意的是
zygote进程是-16,基本不死的,系统进程也在-12左右,想要你的进程常驻内存,可以在配置文件设置android:persistent,提高oom_adj的值。

4.工具命令查看内存

首先来看一个工具procrank,这个工具可以方便地显示各个进程的内存状况,用的时候需要cp文件到手机内
1.mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
2.libpagemap.so复制到/system/lib     procmem和Procrank复制到/system/xbin下面 然后chmod 777这两个文件
操做完之后就可以在adb直接调用procrank命令了。
Android性能之内存基础篇(二)_第1张图片

上面几个参数前面介绍过了,就不多说了。

接下来介绍查看应用剩余的RAM,直接cat /proc/meminfo即可
然后,看某个进程内存:dumpsys meminfo [packageName]
这部分解释看这篇文章:http://my.oschina.net/shaorongjie/blog/128442  不重复写了


5.开发中可以避免的问题点

这里将会列出来代码中容易引起内存泄露的地方
1.Cursor没有关闭
2.IO流没有关闭
3.adapter的contentView没有复用
4.Bitmap没有回收 Bitmap没有设置option属性 RGB_656颜色值
5.滥用static

你可能感兴趣的:(Android性能之内存基础篇(二))