刘炳昭 2012-06-18
一、Android内存管理策略
1.BackingSwap(优先执行Compcache,不能满足要求时再启用SWAP)
2.Compcache(压缩缓存,消耗CPU性能,比较费电)
3.Swap(传统LINUX的SWAP,加速SWAP所在介质的损耗)
4.lowmemorykiller(低内存杀手)
如启用Backing Swap策略,则同时启用Compcache和SWAP,并优先使用Compcache后再用SWAP,最后再执行owmemorykiller策略。如不开启BackingSwap策略,Compcache策略和SWAP策略只能二选一,最后再执行lowmemorykiller策略。
即使不启用前三种管理策略,lowmemorykiller策略作为Android系统默认的内存管理策略,也始终是开启的。
二,关于Compcache
Compcache是指对内存进行压缩,可以在“设置”-“CM设置”-“性能”-“使用压缩缓存”中设置。如果开启SWAP,这个值是“禁用”,没启用SWAP或Backing Swap,则默认18%,启用的话可以省出一些可用内存,但压缩解压过程会加大CPU的工作量,如果CPU性能不够强,反而会影响系统的流畅性,同时增加电量的消耗,所以,Compcache也要按实际需要设置,辩证对待。如果内存足够大,不推荐开启,CPU性能不够强,也不推荐开启。
三、关于SWAP
SWAP是一种LINUX下的基于内存分页的交换分区,类似虚拟内存技术,作为物理内存不足时的扩展补充,但并不等于是物理内存的直接增量。
使用条件:
1.支持SWAP的内核
2.含有busybox
推荐使用CM的Android的原版和衍生版。
为了方便使用,可根据下面代码说明,制作CreatIMG.sh和90userinit这两个脚本文件,这两个文件都是标准的文本格式内容,可参照下面代码用文本编辑器录入编辑。
1.CreatIMG.sh文件是用来在指定位置上生成指定大小的IMG镜像。
mount-oremount,rw/system;//加载system分区
swapoff/dev/block/loop7;
ddif=/dev/zeroof=/system/swap.imgbs=1024count=65536;//创建swap.img文件,文件大小为count=65536,即64M
2.90userinit文件是让开机就自动运行挂载SWAP.IMG镜像并启用SWAP脚本。
mount-oremount,rw/system;//加载system分区
losetup/dev/block/loop7/system/swap.img;//将swapfile文件虚拟成设备分区loop7.
mkswap/dev/block/loop7;//将设备分区loop7创建为交换区
swapon/dev/block/loop7;//启用交换分区
上面代码中/system目录和swap.img文件名是可以自定义的,支持手机内置闪存任意位置,也支持外置闪存SD、TF卡任意位置,甚至是TF卡里的EXT分区。例如手机内置闪存的/data目录下(这也就是用户软件安装的目录),或是手机内置闪存/system目录(也就是系统目录)。
使用方法:
1.把CreatIMG.sh文件复制到手机里(/system或/data都可以,但不能是/sdcard)。
2.点击CreatIMG.sh文件,选择“执行”。
目的:在system目录下生成IMG文件。
注意:RE浏览器要重新打开system目录,才能看到是否已生成IMG文件。如果生成成功,可删除CreatIMG.sh。
4.把90userinit文件复制到/system/etc/init.d/目录下,更改权限为可执行rwxr-x---。
目的:开机自动挂载IMG文件用于SWAP。
5.重启,再打开超级终端输入 free 命令查看是否SWAP已加载成功,如果看swap那一行不全是0,且是你指定的容量(数字是以KB为单位),则说明正确启用SWAP。四、关于swappiness
含义:当可用内存不足时,会启用swap,swappiness是决定SWAP使用频率的参数,这个值保存在/proc/sys/vm/swappiness文件里!
查看的命令:
cat/proc/sys/vm/swappiness
显示结果是一个整数。
修改的命令:
su//进入管理员模式
sysctl-wvm.swappiness=60
或者
su//进入管理员模式
echo60>/proc/sys/vm/swappiness
CM的Android2.3默认值是60,这个值越小意味着系统对swap的使用频率就越低,即会尽可能使用你的物理内存。当然,这个设置要辩证使用,当物理内存足够多时,你可以把它设置尽可能设置为小一点的值,如10(甚至为0,但不会禁用SWAP),使系统尽量少用SWAP,且尽量使用物理内存,这将会带来一定的性能提升;同样,如果物理内存比较小,这个值设置过小了会让SWAP起不到应有的作用,反而影响性能。
五、关于lowmemorykiller
含义:当Android系统判断当前已经没有足够的内存来运行新的进程,需要关闭一些虽然开着却没怎么使用的进程来释放可用内存,这时就根据ActivityManagerService.java记录着每一个进程的优先级,去查杀低优先级的程序。查杀规则保存在/sys/module/lowmemorykiller/parameters/minfree!
显示的命令:
cat/sys/module/lowmemorykiller/parameters/minfree
显示出的应该是6个整数,例如CM的Android2.3默认值是2048,3072,4096,6144,7168,8192,分别逗号隔着。这些整数的单位是page,因为1page=4kilobyte(1Page=4KB),也就是256page=1MB,假如你要设置64MB,那64*256=16384page。6个数字分别从左到右对应前台程序(FOREGROUND_APP)、可见应用(VISIBLE_APP)、次要服务(SECONDARY_SERVER)、隐藏应用(HIDDEN_APP)、内容供应商(CONTENT_PROVIDER)、空置应用(EMPTY_APP)这6类进程的内存警戒值,当可用内存少于某警戒值时,系统会lowmemorykiller杀死该特定值对应的那一类进程。一般前三个值保持默认即可,主要修改后面三个值,推荐为“*,*,*,8448,8192,16384”,当然,这几个值也要辩证对待,看你最常使用的软件类型作出调整。
修改的命令:
su//进入管理员模式
echo "1536,2048,4096,8448,8192,16384" > /sys/module/lowmemorykiller/parameters/minfree