Android内存管理策略的优化

来源:互联网 发布:中国m2历年数据 2016 编辑:程序博客网 时间:2024/04/29 08:36

一、 Android 内存管理策略

1.Backing Swap (优先执行Compcache,不能满足要求时再启用SWAP) 

2.Compcache (压缩缓存,消耗CPU性能,比较费电) 
3.Swap (传统LINUX的SWAP,加速SWAP所在介质的损耗) 
4.lowmemorykiller (低内存杀手) 

如启用Backing Swap策略,则同时启用Compcache和SWAP,并优先使用Compcache后再用SWAP,最后再执行owmemorykiller策略。

 


如不开启Backing Swap策略,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 -o remount,rw /system;       //加载system分区 
swapoff /dev/block/loop7; 
dd if=/dev/zero of=/system/swap.img  bs=1024 count=65536;       //创建swap.img 文件,文件大小为count=65536,即64M 

2.90userinit文件是让开机就自动运行挂载SWAP.IMG镜像并启用SWAP脚本。 

mount -o remount,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 -w vm.swappiness=60 

或者 

su      //进入管理员模式 

echo 60 > /proc/sys/vm/swappiness 

CM的 Android   2.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的 Android   2.3 默认值是2048,3072,4096,6144,7168,8192,分别逗号隔着。这些整数的单位是page,因为1 page = 4 kilobyte (1 Page = 4 KB),也就是256 page = 1 MB,假如你要设置64MB,那64*256=16384 page。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

原创粉丝点击