Low memory killer是Android内存清理机制,因移动端设备的内存、性能、电量等因素Android内核维护一套内存清理机制,就是LMK机制,会定期检查应用内存使用情况、杀死一些进程来释放内存,Low memory killer 主要通过进程oom_adj来判定进程重要度,这个值越小程序越重要,被杀死的可能性越低。
1.基本原理和重要概念
Low memory killer根据两个原则,进程的重要性和释放这个进程可获取的空闲内存数量,来决定释放的进程。
(1) 进程分类,后面的数字为oom_adj值,每个进程都有oom_adj值,越小越重要,被杀的可能性越低,在相同oom_adj下内存占用大的优先被回收。
名称 oom_adj值 解释
FOREGROUD_APP 0 前台程序,可以理解为你正在使用的程序
VISIBLE_APP 1 用户可见的程序
SECONDARY_SERVER 2 后台服务,比如微信会在后台运行服务
HOME_APP 4 HOME,就是主界面
HIDDEN_APP 7 被隐藏的程序
CONTENT_PROVIDER 14 内容提供者
EMPTY_APP 15 空程序,既不提供服务,也不提供内容
(2) Android有两个数组,lowmem_adj和lowmen_minfree,lowmem_adj存放着oom_adj的阈值,lowmen_minfree存放minfree的警戒值,单位为页(一页4K),通过这两个数组计算需要回收的进程。
oom_adj 警戒值
0 1536
1 2048
2 4096
7 5120
14 5632
15 6144
(3) LMK检查的时候基于多个标准来给每个进程评分,对adj高于多少(min_adj)的进程进行分析是否释放,评分最高的被选中并Kill。
2.进程oom_adj配置
进程的oom_adj是可以配置的,进程的类型在ActivityManagerService中可以看到。
进程类型:
static final int EMPTY_APP_ADJ;
static final int HIDDEN_APP_MAX_ADJ;
static final int HIDDEN_APP_MIN_ADJ;
static final int HOME_APP_ADJ;
static final int BACKUP_APP_ADJ;
static final int SECONDARY_SERVER_ADJ;
static final int HEAVY_WEIGHT_APP_ADJ;
static final int PERCEPTIBLE_APP_ADJ;
static final int VISIBLE_APP_ADJ;
static final int FOREGROUND_APP_ADJ;
static final int CORE_SERVER_ADJ = -12;
static final int SYSTEM_ADJ = -16;
其中SYSTEM_ADJ代表着系统进程,CORE_SERVER_ADJ为系统核心服务,这类进程永远不会被杀死,EMPTY_APP、CONTENT_PROVIDER 只类的最容易被杀死,FOREGROUND的进程很难被杀死。
网友评论