当前位置: 代码迷 >> Android >> Android内存储器管理策略的优化
  详细解决方案

Android内存储器管理策略的优化

热度:24   发布时间:2016-05-01 20:49:17.0
Android内存管理策略的优化

一、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

  相关解决方案