android lowmemorykiller笔记

来源:互联网 发布:淘宝网狗狗 编辑:程序博客网 时间:2024/05/16 23:48

android系统运行过程中,遇到内存不足时会自动去回收空进程,cached进程,即lowmemorykiller回收机制;
触发进程回收的场景是系统当前可用内存低于minfree配置的内存大小;
回收的基本策略是将oom_score_adj值越高的进程优先回收;
为更好地使用oom_score_adj需要知道它是如何产生, 又如何利用它来杀进程的.
1.进程创建
每个进程(bin或者app)创建的时候,进程优先级(oom_adj,oom_score_adj)默认为父进程的级别
进程创建的时候会创建对应的proc文件系统
kernel/fs/proc/base.c
里面会有oom_adj, oom_score_adj的read/write接口.
/proc/pid/oom_adj
/proc/pid/oom_score_adj ==>值默认为父进程的值

2.lowmemorykiller
kernel/drivers/staging/android/lowmemorykiller.c
创建lowmemkiller 模块module
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller/parameters/minfree
lowmem_init:
static struct shrinker lowmem_shrinker = {
.scan_objects= lowmem_scan,
.count_objects = lowmem_count,
.seeks = DEFAULT_SEEKS * 16
};
register_shrinker(&lowmem_shrinker);
注册lowmem_shrinker到vmscan (linux内存管理模块)
==>kernel/mm/vmscan.c
由Linux内存管理模块线程函数里面调度kswapd_shrink_zone->…->scan_objects
来触发lowmem_scan执行lowmem killer
lowmem_scan:
(1)根据当前系统free内存和每个进程的oom_score_adj来决定当前哪个进程将会被killed.
参考两个数组:
lowmem_adj[6] //oom_adj分6个级别
//adj:0,2,4,6,9,15 ==>oom_score_adj:= oom_adj*1000/-17
//adj调整级别: 17 #define OOM_ADJUST_MIN (-16)
18 #define OOM_ADJUST_MAX 15
lowmem_minfree[6]; //minfree:2048,6144,7168,10240,15360,20480

(2)遍历进程task list中的所有进程,找到一个进程的oom_score_adj最大,且占用的线程stacksize又最大的,来通知kill;

3.上层调整进程的进程优先级
从1/2可以看出,要想提高进程优先级,尽量避免自己被杀,那就得提高进程的oom_score_adj
针对android系统的lowmemkiller,主要都是由AMS服务来动态更新oomlevel来调整app进程级别.
AMS.applyOomAdjLocked ==>Process.setOomAdj ==>修改/proc/pid/oom_adj
这个接口会在一些场景下出发,eg:activity的创建与启动,结束; service的创建与启动,结束;等..

原创粉丝点击