2019-10-20 [M2.Android中的lowMemoryKiller机制]

[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)。

Android进程调度之adj算法

Android进程生命周期与ADJ

Android LowMemoryKiller 简介

2.2 进程分5级:

前台进程(Foreground process)

可见进程(Visible process)

服务进程(Service process)

后台进程(Background process)

空进程(Empty process)

每个 Java 进程都有一个相关联的 ProcessRecord 对象,其成员变量 curAdj 就表示该进程当前状态下的优先级

2.3 lmkd(Low Memory Killer Daemon) 低内存杀手守护进程

用户空间中的 lmkd

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 进程操作。

你可能感兴趣的:(2019-10-20 [M2.Android中的lowMemoryKiller机制])