Android 有两种处理内存不足的进程:内核交换守护进程(kswapd)和低内存终止守护进程(LowMemoryKiller)。
对应着两种内存不足时候的处理方式。
kswapd
1、kswapd, 是 Linux 内核的一部分,用于将已使用内存转换为可用内存。当设备上的可用内存不足时,该守护进程将变为活动状态。
对于RAM与zRAM,Android 使用了跟 Linux 相似的管理手法,分页。RAM 分为多个“页”。通常,每个页面为4KB 的内存。系统会将页面分为“可用” 或“已使用”。
- 文件页(缓存页):有存储器中的文件(例如代码或内存映射文件)支持的内存。也即 File-backed Page,从名字理解,就是在磁盘上有文件对应的页,包括缓存、缓冲以及通过内存映射获得的页;
缓存内存有两种类型:
- 私有页:由一个进程拥有且未共享;
- 干净页:存储器中未经修改的文件副本,可由 kswapd 删除以增加可用内存;
- 脏页:存储器中经过修改的文件副本;可由 kswapd 移动到 zRAM 或在 zRAM 中进行压缩以增加可用内存;
- 共享页:由多个进程使用;
- 干净页:存储器中未经修改的文件副本,可由 kswapd 删除以增加可用内存;
- 脏页:存储器中经过修改的文件副本;允许通过 kswapd 或者通过明确使用 msync()或 munmap() 将更改写回存储器中的文件,以增加可用空间;
当文件页被修改过后,并且暂时还没写将数据写入磁盘,页中的数据与磁盘不一致,这样的页就是脏页。在回收前,需要先回写到磁盘。
- 匿名页:没有存储器中的文件支持的内存(例如,由设置了 MAP_ANONYMOUS 标记的 mmap() 进行分配);
- 脏页:可由 kswapd 移动到 zRAM/在 zRAM 中进行压缩以增加可用内存;
文件页和匿名页_SEVENTHD7的博客-CSDN博客_匿名页 文件页
(1)对于文件页,因为有磁盘文件对应,回收的时候可以直接释放掉,但下次再使用的时候又要从磁盘读入,会产生 IO。
(2)对于匿名页,回收是将其 swpa out 到 swap 分区中,也就是将其压缩存放,在下次使用时,只需要进行解压,swap in 回内存空间。
2、Linux 内核设有可用内存上下限阈值。当可用内存降至下限阈值以下时,kswapd 开始回收内存页。当可用内存达到上限阈值时,kswa