(一)LMK简介
时间:2022-10-31 15:00:00
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_ADJ | 16 | 一般来说,缓存过程,无法获得确定值 |
CACHED_APP_MAX_ADJ | 15 | 看不见进程adj最大值 1 |
CACHED_APP_MIN_ADJ | 9 | 看不见进程adj最小值 2 |
SERVICE_B_AD | 8 | B List中的Service(使用老的可能性较小) |
PREVIOUS_APP_ADJ | 7 | 上一个App过程(通常按返回键) |
HOME_APP_ADJ | 6 | Home进程 |
SERVICE_ADJ | 5 | 服务进程(Service process) |
HEAVY_WEIGHT_APP_ADJ | 4 | 后台的重量级过程,system/rootdir/init.rc文件中设置 |
BACKUP_APP_ADJ | 3 | 备份进程 |
PERCEPTIBLE_APP_ADJ | 2 | 可感知过程,如后台音乐播放 |
VISIBLE_APP_ADJ | 1 | 可见进程(Visible process) |
FOREGROUND_APP_ADJ | 0 | 前台进程(Foreground process) 6 |
PERSISTENT_SERVICE_ADJ | -11 | 关联系统或persistent进程 |
PERSISTENT_PROC_ADJ | -12 | 系统persistent进程,比如telephony |
SYSTEM_ADJ | -16 | 系统进程 |
NATIVE_ADJ | -17 | native过程(无系统管理) |
LMK进程内存释放是根据当前可用的内存情况进行的,总设计了粗线,即LMK杀戮过程的6档,如下:
- CACHED_APP_MAX_ADJ
- CACHED_APP_MIN_ADJ
- BACKUP_APP_ADJ
- PERCEPTIBLE_APP_ADJ
- VISIBLE_APP_ADJ
- FOREGROUND_APP_ADJ
当系统内存不足时,LMK也会从CACHED_APP_MAX_ADJ(第一档)开始杀戮过程,如果内存不足,就会杀戮CACHED_APP_MIN_ADJ(二档),以此类推。
3、adj
那系统如何判断内存不足呢?
根据这6档设置相应的内存值,每个系统都不一样,可以自定义
android 9 及以下
需要注意的是,这里的单位不是KB,而是page(1 page = 4KB), 换算逻辑是(X / 1024 * 4)M
|
adj 上面16-17没有显示 取值,但另一套更大范围的值。这样可以进一步细化过程的优先级,对每个过程进行排序。
LMK 该机制将对每个应用程序的内存进行评分。当内存不足时,将首先对高分应用程序进行评分kill,所以oom_score_adj (下见 cat /proc/pid/oom_score_adj)是另一种形式adj,比adj 更加细分。
android 10
getpropsys.lmk.minfree_levels
了解当前阀值列表后,还需要检查当前应用程序的相应位置。
查看单个应用的优先级
|
以oom_score_adj为准
查看当前系统应用优先顺序
dumpsys activity o
dumpsys activity|grep -A 30 oom_adj (目前大约有20个进程排列,因此过滤显示30行,并非所有进程都会进入排列,dumpsys activity processes 还有相关信息,关键词 sorted by oom_adj)
也可以通过dumpsys meminfo 检查排列,但在同一级别优先级可能没有按顺序(实际测试时要注意)