[2.Android中的lowMemoryKiller机制]
2.1 what is LMK
一种根据==阈值级别==触发相应力度的内存回收的机制(源自 Linux OOM Killer)。
Android Kernel每隔一段时间会检测当前空闲内存是否低于某个阀值。假如是,则杀死oom_adj最大的不必要的进程,如果有多个,就根据 oom_score_adj 去杀死进程,,直到内存恢复低于阀值的状态
进程有两个比较重要的状态值,即adj(adjustment 定义在ProcessList.java )和procState(定义在ActivityManager.java)。
2.2 进程分5级:
前台进程(Foreground process)
可见进程(Visible process)
服务进程(Service process)
后台进程(Background process)
空进程(Empty process)
每个 Java 进程都有一个相关联的 ProcessRecord 对象,其成员变量 curAdj 就表示该进程当前状态下的优先级
2.3 lmkd(Low Memory Killer Daemon) 低内存杀手守护进程
Android P 源码分析 5 - Low memory killer 之 lmkd 守护进程
从 Android 9 开始,用户空间 lmkd 会在未检测到内核 lowmemorykiller 驱动程序时激活。请注意,用户空间 lmkd 要求内核支持内存 cgroup。因此,要改用用户空间 lmkd,您应使用以下配置设置编译内核:
跟大多数守护进程一样,lmkd 也是由 init 进程启动的(socket)
以上整个过程可以简单总结如下:
- 1.系统 Framework 层根据不同类型进程生命周期控制,动态分配不同的 adj 值,并且在一定的时机会对所有进程的 adj 进行更新;
- 2.更新 adj 时,==Framework 层会和 lmkd 守护进程进行通==信,修改系统 lmk driver 配置的参数,同时设置 /proc/pid/oom_score_adj;
- 3.lowmemorykiller 驱动会被 linux 内核的内存 ==shrinker== 机制调度,在 shrinker 操作中,计算进程 adj 和 rss,依据 driver 的 oom_adj 和 minfree 配置,进行 kill 进程操作。