LMK机制

作者: 蒸汽飞船 | 来源:发表于2018-07-10 23:23 被阅读130次

1.1 基本原理

Low Memory Killer与OOM的区别:OOM即Out ofMemory是标准linuxKernel的一种内存管理机制,LowMemory Killer在它基础上作了改进:

  • OOM基于多个标准给每个进程打分,分最高的进程将被杀死;LowMemory Killer则用oom_adj和占用内存的大小来选择Bad进程;
  • OOM在内存分配不足时调用,而LowMemory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。

static intlowmem_adj[6] = {

       0,

       1,

       6,

       12,

};

static intlowmem_adj_size = 4;

static intlowmem_minfree[6] = {

       3 * 512,       /* 6MB,单位是4k */

       2 * 1024,      /* 8MB */

       4 * 1024,      /* 16MB */

       16 * 1024,     /* 64MB */

};
  1. lowmem_adj[6] : 中各项数值代表阈值的警戒级数;
  2. lowmem_minfree[6] :代表对应级数的剩余内存。

也就是说,当系统的可用内存小于6MB时,警戒级数为0;当系统可用内存小于8M而大于6M时,警戒级数为1;当可用内存小于64M大于16MB时,警戒级数为12。

Low memory killer的规则就是根据当前系统的可用内存多少来获取当前的警戒级数,

  1. 如果进程的oom_adj大于警戒级数并且最大,进程将会被杀死(具有相同oom_adj的进程,则杀死占用内存较多的)。
  2. oom_adj越小,代表进程越重要。一些前台的进程,oom_adj会比较小,而后台的服务,oom_adj会比较大,所以当内存不足的时候,Low memory killer必然先杀掉的是后台服务而不是前台的进程。

这里总结一下OOMlevels的更新:更新是在系统启动后,第一个configurationchange的消息到AMS的时候。adj值为一组固定的预定义的值;各个adj所对应的minfree阈值则根据系统的内存大小和屏幕的分辨率计算得出,各个设备还可以通过framework的configconfig_lowMemoryKillerMinFreeKbytesAdjust

和config_lowMemoryKillerMinFreeKbytesAbsolute来定制最终各个adj所对应的minfree阈值。

这里还要提一下Process是怎么set adj值的。

通过Process.setOomAdj(intpid, int amt)进行设置,其中在ActivityManagerService中updateOomAdjLocked()函数中就有调用。


2.LMK的工作机制

LMK开始工作时,
首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。
然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。

最关键的一步就是,发送SIGKILL信息,杀掉该进程。
LMK低内存管理机制


LMK开始工作时, 首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。 最关键的一步就是,发送SIGKILL信息,杀掉该进程。

最后值得提到的就是ActivityManageService.java中的OOM了,主要是当后台进程数达到阀值ProcessList.MAX_HIDDEN_APPS 15后对被杀进程的选择,而且进程的oom_adj也会适当地被调整。


发现执行了lowmemorykiller的进程总共有3个:内核线程kswapd0、native app adbd和app com.example.outX。由此,我们推测lowmemorykiller大概有两种执行方式:

(1)是在kswapd0中,kswapd内核线程会被定期唤醒,当它发现系统内存不足的时候,它就会去执行lowmemorykiller杀进程,并回收内存。

(2)是在app中,当一个app请求分配内存,而系统又没有足够的内存可供分配时,则分配内存的请求将会先被阻塞,执行lowmemorykiller杀进程,回收内存之后再尝试着去分配内存。

相关文章

  • LMK机制

    1.1 基本原理 Low Memory Killer与OOM的区别:OOM即Out ofMemory是标准linu...

  • 2019-10-20 [M2.Android中的lowMemor

    [2.Android中的lowMemoryKiller机制] 2.1 what is LMK 一种根据==阈值级别...

  • LMK机制(Low Memory Killer)

    Low memory killer是Android内存清理机制,因移动端设备的内存、性能、电量等因素Android...

  • Android进程系列第七篇---LowmemoryKiller

    前面进程系列已经更新了六篇,本文(基于Android O源码),梳理LMK杀进程机制中篇,主要总结Lowmemor...

  • android 内存介绍

    android 使用的沙箱机制,每个应用分配的内存大小是有限的,内存太低就会触发LMK-low memory ...

  • Android进程系列第六篇---LowmemoryKiller

    一、内容预览 二、概述 前面进程系列已经更新了五篇,本文(基于Android O源码),梳理LMK杀进程机制上篇,...

  • 内存泄露相关

    ·# 内存 对用户体验影响 可能oom 内存过大被LMK机制杀死。 内存抖动造成程序卡顿 原理 内存分配策略 首先...

  • Android进程系列第八篇---LowmemoryKiller

    前面进程系列已经更新了七篇,本文(基于kernel 3.18),基于前两篇博客,继续梳理LMK杀进程机制下篇,主要...

  • LMK low memory killer

    LMK是Android在,手机内存不足的情况下,所做出的的应对机制,它是在OOM Killer 基础上修改而来的,...

  • Leoric骷髅王保活方案阅读

    很久之前整理过一套完整的Android 保活方案主要集中在 1.提升进程优先级(oom_adj),降低被LMK机制...

网友评论

      本文标题:LMK机制

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