LMK机制(Low Memory Killer)

2018-12-04  本文已影响0人  我就是非主流

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的进程很难被杀死。

上一篇下一篇

猜你喜欢

热点阅读