首页 > 代码库 > 巧妇能为少米之炊(1)——Android下小内存下的生存之道
巧妇能为少米之炊(1)——Android下小内存下的生存之道
经常听到身边用安卓的朋友抱怨手机卡顿,内存动不动就快没了,而Google声称在512M的内存下也能流畅运行Android 4.4,到底它做了什么?
总结一下它主要做了四件事:
1.优化内核,使用ActivityManager来减少直接内存回收
2.优化LMK(low memory killer)的临界值
3.使能KSM(Kernel Samepage Merging)
4.使能ZRAM代替SWAP分区
这几个事情,个人只有第三和第四件事情看起来比较靠谱。
优化内核的事情:
摘自Google官方网站的英文介绍,翻译过来的意思大概是: 修改临界值,减少直接内存回收,因为直接内存回收会需要额外的IO操作,耗时较大,利用空闲的时间增加后台回收。
众所周知,对EMMC读写的时候,是非常耗费时间的,因为内存的读写速度要高出EMMC读写速度几个量级,因此减少与EMMC交互的确可以节省很多时间,减少卡顿,但是每个人的使用习惯不同,怎么要修改算法使得减少直接内存回收呢?我不知道,但是我觉得这个优化等于说废话,到底咋样,使用过后才知道。
关于LMK:
Linux内核中,用OOM来回收内存,即当内存不够的时候,调用一种算法,把那些不用的,优先级别比较低的,都给释放掉,这样腾出一部分内存,于是内存就变大了,而Android中,对这个OOM机制做了一个优化,它就叫LMK。
它认为,如果等到OOM发生的时候,内存已经非常不足了,这个时候再去释放内存,系统的响应时间会变的非常长,造成非常差的用户体验,于是LMK做了一个改变,定时检查空闲内存,当少于某个伐值的时候,就杀掉一些进程,腾出一些空间,这样保证系统中一直有较大的空闲内存,可以减少卡顿。有道理,后面的章节中会仔细讲诉LMK。
KSM:
这个东西早在2009年的时候就出来了,但是反映比较平淡,原因是:KSM合并相同页面,即合并副本内存,可以节省不必要的内存,但而采用此方法,会增加耗电量,不得已的时候才会打开。
什么是ZRAM:
说的明白一点,ZRAM就是SWAP的一个改进,一般发生SWAP的时候,是把要置换出去的数据存到外部磁盘上(手机就是EMMC,电脑就是硬盘),这样会降低效率,于是聪明的开发者们相处一个方法,那就是把要置换出去的东西压缩还放在内存中,这样消耗的只是解压时间,而这个时间远远小于与外部磁盘交互所消耗的时间。是个比较靠谱的方式,下面的章节中,将详细讲诉它的调用过程以及如何打开。
于是LMK,KSM和ZRAM是笔者认为比较靠谱的方式,下面的几个章节,将分别讲诉他们如何被使能,以及具体的调用过程和原理。
巧妇能为少米之炊(1)——Android下小内存下的生存之道