(一)LMK简介

1、概述

LMK (low meminfo killer) 即当系统可用内存太低时,系统会触发LMK,杀掉一些进程释放内存出来。android 会为进程分配优先级,优先级越低的应用,在内存不足时,会优先被杀。优先级与进程的类型和进程被调度的次序有关系。

2、优先级

android 进程的优先级(从高到低)

前台进程,正在活动的Activity或者使用startForeground的Service。onReceive 的BroadcastReceiver 等
可见进程,如 onPause 的Activity
服务进程,后台服务,如正在运行startService 启动的service
后台进程,对用户交互无影响,如onStop状态的Activity 等
空进程,一般用作缓存以缩短下次启动时间

而LMK 则是根据oom_adj (Out of Memory Adjustment)来设置的,与android 的进程优先级有相似的地方,但又不完全相同

ADJ级别

取值

解释

UNKNOWN_ADJ16一般指将要会缓存进程,无法获取确定值
CACHED_APP_MAX_ADJ15不可见进程的adj最大值 1
CACHED_APP_MIN_ADJ9不可见进程的adj最小值 2
SERVICE_B_AD8B List中的Service(较老的、使用可能性更小)
PREVIOUS_APP_ADJ7上一个App的进程(往往通过按返回键)
HOME_APP_ADJ6Home进程
SERVICE_ADJ5服务进程(Service process)
HEAVY_WEIGHT_APP_ADJ4后台的重量级进程,system/rootdir/init.rc文件中设置
BACKUP_APP_ADJ3备份进程 
PERCEPTIBLE_APP_ADJ2可感知进程,比如后台音乐播放
VISIBLE_APP_ADJ1可见进程(Visible process)
FOREGROUND_APP_ADJ0前台进程(Foreground process) 6
PERSISTENT_SERVICE_ADJ-11关联着系统或persistent进程
PERSISTENT_PROC_ADJ-12系统persistent进程,比如telephony
SYSTEM_ADJ-16系统进程
NATIVE_ADJ-17native进程(不被系统管理)

LMK根据当前可用内存情况来进行进程内存释放,总设计了6个级别,即上表中加粗的行,即LMK的杀进程的6档,如下:

  1. CACHED_APP_MAX_ADJ
  2. CACHED_APP_MIN_ADJ
  3. BACKUP_APP_ADJ
  4. PERCEPTIBLE_APP_ADJ
  5. VISIBLE_APP_ADJ
  6. FOREGROUND_APP_ADJ

当系统内存不足时,LMK也会从CACHED_APP_MAX_ADJ(第1档)开始杀进程,如果内存还不足,那么会杀CACHED_APP_MIN_ADJ(第2档),不断深入,以此类推。

3、adj

那么系统是怎么判断内存不足的呢?

系统根据这6档设置相对应的内存值,每个系统不一样,可以自定义

android 9 及以下

要注意的是,这里的单位不是KB,而是page(1 page  = 4KB), 换算逻辑是(X / 1024 * 4)M

cat /sys/module/lowmemorykiller/parameters/minfree

18432,23040,27648,32256,55296,80640

cat /sys/module/lowmemorykiller/parameters/adj    

0,100,200,300,900,906


adj 显示出的不是上面16到-17 的取值,而是另一套更大范围的值。这样可以更进一步地细化进程的优先级,为每个进程排序。

LMK 机制会为每个应用的内存进行打分,当内存不足时,会将分高的应用先kill,所以oom_score_adj (下见 cat /proc/pid/oom_score_adj)就是另一种形式上的adj,比adj 更加细分。

android 10

getprop sys.lmk.minfree_levels

知道了当前阀值列表后,还需要查看当前应用对应的位置。

查看单个应用的优先级

cat /proc/pid/oom_adj

cat /proc/pid/oom_score_adj

以oom_score_adj 为准

查看当前系统应用优先级排列顺序

dumpsys activity o

dumpsys activity|grep -A 30 oom_adj  (当前例子大概有20左右个进程排列,所以过滤显示30行,不是所有进程都会进入排列,dumpsys activity processes 也有相关信息,关键字  sorted by oom_adj)

也可以通过dumpsys meminfo 来查看排列,但是同一级内的优先级可能没有按顺序(实际测试时要注意)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值