lowmemorykiller:
/sys/module/lowmemorykiller/parameters/minfree: 里面是以”,”分割的一组数,每个数字代表一个内存级别
1950,2250,3000,3500,5000,7500
/sys/module/lowmemorykiller/parameters/adj: 对应上面的一组数,每个数组代表一个进程优先级级别
0,58,117,176,529,882
ro.brand.lmkd.minfree="7800,9000,12000,14000,20000,30000" KB
-->mOomMinFree[i]*1024)/PAGE_SIZE
1950,2250,3000,3500,5000,7500
ro.brand.lmkd.adj="0,1,2,3,9,15"
->mOomAdj[i] * 1000) / 17
0,58,117,176,529,882
举个例子:
/sys/module/lowmemorykiller/parameters/minfree:18432,23040,27648,32256,55296,80640
/sys/module/lowmemorykiller/parameters/adj:0,100,200,300,900,906
代表的意思:两组数一一对应,当手机内存低于80640时,就去杀掉优先级906以及以上级别的进程,当内存低于55296时,就去杀掉优先级900以及以上的进程。
对每个进程来说:
/proc/pid/oom_adj:代表当前进程的优先级,这个优先级是kernel中的优先级,这个优先级与上层的优先级之间有一个换算,文章最后会提一下。
/proc/pid/oom_score_adj:上层优先级,跟ProcessList中的优先级对应
进程的优先级调整都在AMS里面,AMS根据进程中的组件的状态去不断的计算每个进程的优先级,计算之后,会及时更新到对应进程的文件节点中,而这个对文件节点的更新并不是它完成的,而是lmkd,他们之间通过socket通信。
上层AMS跟lmkd通信主要分为三种command,每种command代表一种数据控制方式,在ProcessList以及lmkd中都有定义:
LMK_TARGET:更新/sys/module/lowmemorykiller/parameters/中的minfree以及adj
LMK_PROCPRIO:更新指定进程的优先级,也就是oom_score_adj
LMK_PROCREMOVE:移除进程
上层代码的调用时机这里就不细化了,往前追的话基本都是在ActivityManagerService中的udpateOomAdj中,也就是说上层根据四大组件的状态对进程的优先级进行调整之后,会及时的反应到lmkd中,在内存不足的时候触发杀进程,会从低优先级开始杀进程。command一共有三种,在上层的代码是在ProcessList中。
ProcessList.updateOomLevels
LMK_TARGET
cmd_target
ProcessList.setOomAdj
LMK_PROCPRIO
cmd_procprio
ProcessList.remove
LMK_PROCREMOVE
cmd_procremove
杀进程
根据当前内存的状态查找需要杀掉的进程
find_and_kill_process
通过读取/proc/pid/statm
send signal SIGKILL
kill_one_process
vendor/brand/kernel/linaro/drivers/staging/android/lowmemorykiller.c
使用kernel interface的,其实也就是kernel中的lowmemorykiller
// 下面两个数组分别代表了两个参数文件中的默认值,数组默认的size都是6
// 对应 "/sys/module/lowmemorykiller/parameters/adj"
static short lowmem_adj[6] = {
0,
1,
6,
12,
};
static int lowmem_adj_size = 4;
// 对应 "/sys/module/lowmemorykiller/parameters/minfree"
static int lowmem_minfree[6] = {
3 * 512, /* 6MB */
2 * 1024, /* 8MB */
4 * 1024, /* 16MB */
16 * 1024, /* 64MB */
};
static int lowmem_minfree_size = 4;
扫描当前内存以及杀进程:
lowmem_scan
lmk_vmpressure_notifier中定义了什么时候去kill_one_more,主要是当内存压力在95以上时
killBackgroundProcesses
killPackageProcessesLocked(packageName, appId, userId, ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
removeProcessLocked