Low Memory Killer in Android

Low Memory Killer(LMK)在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的oom_adj值在同一范围时,该进程将被Kill掉。

LMK的策略记录在下面两个文件中:

  1. /sys/module/lowmemorykiller/parameters/adj 这个文件指定了发生LMK时,需要kill掉的进程号区间。
  2. /sys/module/lowmemorykiller/parameters/minfree 这个文件中储存了将导致调用LMK的空闲页面数量值。

看一个例子

adj文件的内容为:

0,58,117,176,529,1000

minfree文件的内容为:

12288,15360,18432,21504,24576,30720

这里些数组的具体含义是指: 当一个进程的空闲空间下降到了30720个页面时,系统将kill掉进程号 >= 1000的进程; 当一个进程的空闲空间下降到了24587个页面时,系统将kill掉进程号 >= 529的进程; … …

怎样让你的App不被KML

你可以在AndroidManifest.xml中的Application中增加属性

android:persistent="true"

这个属性会把你的APP提升为Android核心级别,在这个级别上的APP,即使你用ps -9也无法kill掉它(它会立刻重启)。

但是这个方法有一个限制,就是你的APP需要是系统APP,也就是说需要被push到/system/app/或者/system/priv-app/下,否则android:persistent="true"这个属性不会生效。

当你为你的APP设置了persistent后,查看一下你的APP的oom_adj值:

cat /proc/3730/oom_adj  #3730为你APP的PID

我的APP的oom_adj值为-12,从上面的LMK策略可以看到LMK将永远不会kill一个oom_adj < 0 的进程,实际上它是一个CORE_SERVICE_ADJ. (ps:源码路径frameworks/base/services/java/com/android/server/am/ActivityManagerService.java)