多语言展示
当前在线:976今日阅读:91今日分享:37

Android系统在小内存下的使用

最近在调试的方案,硬件配置是512MB的DDR,这在Android4.4这号称优化很大的系统版本上运行还是很吃力,找了一些资料,发现我们的方案上使用到了ZRAM这一技术,直接使用压缩内存来作为交换分区。
方法/步骤
1

最近在调试的方案,硬件配置是512MB的DDR,这在Android4.4这号称优化很大的系统版本上运行还是很吃力,找了一些资料,发现我们的方案上使用到了ZRAM这一技术,直接使用压缩内存来作为交换分区,其中涉及到的内核配置如下:    CONFIG_SWAP=y      CONFIG_CGROUP_MEM_RES_CTLR=y      CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y      CONFIG_ZRAM=y      CONFIG_ZSMALLOC=y

2

接下来运行起来后(如上述编译失败,需要把SYSFS和BLOCK相关配置加上),可以看到有/dev/block/zram0 这一结点,然后我们的方案在init.rc里加了一个service,其为oneshot类型,就是执行一个脚本了,脚本内容如下:        #!/system/bin/sh        echo $((256*1024*1024))  > /sys/block/zram0/disksize        mkswap /dev/block/zram0        swapon /dev/block/zram0        sleep 1        mkfs.ext2 -b 4096 /dev/block/zram0        sleep 1        mount -t rootfs -o remount -rw rootfs /        mkdir /swap_zram0        sleep 1        mount -t rootfs -o remount -r rootfs /        mount -t ext2 -o rw /dev/block/zram0 /swap_zram0    这样的话,我们就有了一个交换分区来使用了,但发现使用free -m命令查看时,SWAP分区一直没有使用,并且一直有lowmemorykiller的操作,后来发现是我们的/sys/module/lowmemorykiller/parameters/minfree参数还是1GB DDR的配置,故而将其按一定比例调小后就可以了。

3

对于/sys/module/lowmemorykiller/parameters/minfree,其6个值与/sys/module/lowmemorykiller/parameters/adj一一对应,而adj这个与每个进程的/proc/X/oom_adj有关系,其中oom_adj的值越小表示越重要,越不可能被杀掉,而adj对应的6组参数在Android源码的frameworks/base/services/java/com/android/server/am/ProcessList.java有其对应值,我们的平台为0,117,235,352,529,1000,相应的minfree在1GB时设置为2048,6144,7168,22528,25600,26624,在512MB时设置为2048,6144,7168,10240,15360,20480。在这里会根据每个进程的oom_adj的值去判断是属于adj的哪个范围,当内存小于minfree对就的值,就去杀掉adj对应范围内的oom_adj所对应的进程。

5

如果SWAP分区不使用,我们还可以调整/proc/sys/vm/swappiness对应值,提升磁盘数据置换到SWAP的可能性,默认为60。

6

如果不想APK对应的进程大容易被KILL掉,可以在AndroidManifest.xml里面加上android:persistent='true'配置。END

推荐信息