lowmemorykiller

来源:互联网 发布:软件管理 编辑:程序博客网 时间:2024/05/17 03:01


frameworks\base\services\core\java\com\android\server\am\ProcessList.java

static final int VISIBLE_APP_ADJ = 100;static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1;// This is the process running the current foreground app.  We'd really// rather not kill it!static final int FOREGROUND_APP_ADJ = 0;// This is a process that the system or a persistent process has bound to,// and indicated it is important.static final int PERSISTENT_SERVICE_ADJ = -700;// This is a system persistent process, such as telephony.  Definitely// don't want to kill it, but doing so is not completely fatal.static final int PERSISTENT_PROC_ADJ = -800;

定义应用不同情况下的  adj 。


private int[] mOomAdj;
private int[] mOomMinFree;
分别对应adj 与 内存,是对应的
if (mTotalMemMb <= LOW_LEVEL_SIZE) {    mOomAdj = new int[] {        FOREGROUND_APP_ADJ,        VISIBLE_APP_ADJ,        PERCEPTIBLE_APP_ADJ,        BACKUP_APP_ADJ,        CACHED_APP_MIN_ADJ,        CACHED_APP_MAX_ADJ    };    mOomMinFree = new int[] {        24576, // 24 * 1024 (ADJ 0 -> 24MB)        31744, // 31 * 1024 (ADJ 1 -> 31MB)        38912, // 38 * 1024 (ADJ 2 -> 38MB)        49152, // 48 * 1024 (ADJ 3 -> 48MB)        122880, // 120 * 1024 (ADJ 9 -> 120MB) (based on AMR performance test)        122880  // 120 * 1024 (ADJ 15 -> 120MB) (based on AMR performance test)    };

一组默认的对应,第一个元素对应:当内存小于24MB 时,对应adj 大于 FOREGROUND_APP_ADJ 应用均可能被杀掉。
                最后一个元素对应:当内存小于120MB时,对应adj 大于 CACHED_APP_MAX_ADJ 的应用会被杀掉。
这里adj 是 -11 ~ 15 似乎跟  mOomAdj 对应不上,这里其实是同一个意思,只是有一个换算。
kernel-3.18/include/uapi/linux/oom.h
#ifndef _UAPI__INCLUDE_LINUX_OOM_H#define _UAPI__INCLUDE_LINUX_OOM_H/* * /proc/<pid>/oom_score_adj set to OOM_SCORE_ADJ_MIN disables oom killing for * pid. */#define OOM_SCORE_ADJ_MIN       (-1000)#define OOM_SCORE_ADJ_MAX       1000/* * /proc/<pid>/oom_adj set to -17 protects from the oom killer for legacy * purposes. */#define OOM_DISABLE (-17)/* inclusive */#define OOM_ADJUST_MIN (-16)#define OOM_ADJUST_MAX 15#endif /* _UAPI__INCLUDE_LINUX_OOM_H */
kernel-3.18\drivers\staging\android\lowmemorykiller.c
static short lowmem_oom_adj_to_oom_score_adj(short oom_adj){   if (oom_adj == OOM_ADJUST_MAX)      return OOM_SCORE_ADJ_MAX;   else      return (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;}

这个函数说明了
adj 是 -11 ~ 15 跟  mOomAdj 换算关系。
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller/parameters/minfree
对应的是 mOomAdj 与 mOomMinFree转换成页之后的值
/proc/1052{$pid}/下
oom_adj         oom_score       oom_score_adj
oom_adj  与oom_score_adj  是  adj  -11 ~ 15 跟  mOomAdj  对应一样的
system/core/lmkd/lmkd.c
http://gityuan.com/2016/09/17/android-lowmemorykiller/