- 当 Free Pages 低于 kswapd 的阈值时,Linux 内核就会通过 kswapd 进程对 Cached Pages 进行回收,若此时想要访问Cached Pages里的内容,就只能从flash中加载,从而严重降低了手机运行的速度。
LMK
简介
通过上部分可以发现,Low Memory Killer在内存不足时显得尤为重要,其在 Cached Pages 低于阈值时被触发。其工作的原理为:是根据进程的优先级,选择性地杀死某个进程,释放该进程占用的所有资源以满足内存分配需要:早年间其进程的优先级大抵如下图所示:(其中Cached是退出后代的进程)通俗的理解为,当内存不够时,LMK会首先将Cached级别的进程杀死,以获得更多的缓存页,如Cached类别中没有其他进程,则会杀死之间的那个进程Android的设置,甚至是home进程(2020年了,已不存在,但模拟中会出现这种情况),产生黑屏现象。
工作原理
具体来讲,LMK是通过3个具体参数决定Kill那个进程的
- oom_adj:在 Framework 层使用,代表进程的优先级,数值越高,优先级越低,越容易被杀死。
- oom_adj threshold:在 Framework 层使用,代表 oom_adj 的内存阈值。Android Kernel 会定时检测当前剩余内存是否低于这个阀值,若低于则杀死 oom_adj ≥ 该阈值对应的 oom_adj 中,数值最大的进程,直到剩余内存恢复至高于该阀值的状态。
- oom_score_adj: 在 Kernel 层使用,由 oom_adj 换算而来,是杀死进程时实际使用的参数。
工作流程
- 启动 lmkd
lmkd 是由 init进程通过解析 init.rc 文件来启动的守护进程,涉及Android的启动流程,详情可以参考博文。lmkd 会创建名为 lmkd 的 socket,节点位于 /dev/socket/lmkd,该 socket 用于跟上层 framework 交互:
service lmkd /system/bin/lmkd
class core
group root readproc
critical
socket lmkd seqpacket 0660 system system
writepid /dev/cpuset/system-background/tasks
2. lmkd 启动后,循环等待ProcessList:
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**