美文网首页
LMK机制(Low Memory Killer)

LMK机制(Low Memory Killer)

作者: 我就是非主流 | 来源:发表于2018-12-04 18:00 被阅读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的进程很难被杀死。

    相关文章

      网友评论

          本文标题:LMK机制(Low Memory Killer)

          本文链接:https://www.haomeiwen.com/subject/pyxvcqtx.html