Android 内存管理

内存不足时:

  1. 首先由 kswapd 尝试交换页面。
  2. 如果内存仍然不够,系统用 通知应用程序内存不足,希望应用主动减少内存使用。
  3. 如果内存仍然不够,使用 LMK 按照一定的优先级杀死应用。

交换

kswapd 负责在内存不足时交换内存页面。zram 和 swap file 都是交换区的实现。狭义的交换指的是 disk swap。

Android 一般厂商都是开 zram,但不开 swap file,原因是 swap file 在闪存上,读取慢,而且移动设备的闪存寿命比电脑硬盘少。在 MIUI 13 的小米 12s Pro(12G)上,zram 的大小是 6G。据说 MIUI 14 的 12G 小米机型用的 zram 是 8G。我还在酷安看到了很多 16G 小米机型使用 14G zram 的例子。

占用方式上,zram 是动态增长的,并不是一开机就占满设定的大小。swap file 虽然是要在开启前就固定大小,但由于其在文件系统上,也可以轻易地删除和重新创建。Android 厂商鼓吹的内存融合很可能就是 swap file

swap partition 是分区,调整起来比 swap file 要麻烦,现在应该很少被使用。而且没有迹象表明 swap file 性能明显低于 swap partition。

有人说 zram 可以超过内存大小,这违反了我的认知。scene 的确可以做这样的修改,但我认为在没有交换的情况下设置 zram 超过内存大小实际上永远装不满。

终止应用

lmkdLow Memory Killer Deamon,用于监控内存压力。其前驱为 lmk 驱动程序,但是由于大量问题转到了用户空间实现。而且在每次 Android 大版本的迭代中,lmkd 通常会有功能上的改进。

从内核 4.12 开始,LMK 驱动程序已从上游内核中移除,改由用户空间 lmkd 来执行内存监控和进程终止任务。