Android Low memory killer by 永远的伊苏
Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中。这样设计的目的是为了下次能快速启动。当然,随着系统运行时间的增长,内存会越来越少。Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。
那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low memory killer机制。
Low memory killer 主要是通过进程的oom_adj 来判定进程的重要程度。oom_adj的大小和进程的类型以及进程被调度的次序有关。
Low memory killer 的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c
其原理很简单,在linux中,存在一个kswapd的内核线程,当linux回收存放分页的时候,kswapd线程将会遍历一张shrinker链表,并执行回调,定义如下:
所以只要注册 Shrinker,变可以在内存分页回收时根据规则释放内存,下面我们来看看其实现。
首先定义shrinker结构体,lowmem_shrink为回调函数的指针,当有内存分页回收的时候,这个函数将会被调用。
Android中,存在着一张内存阈值表,这张阈值表是可以在init.rc中进行配置的,
我们来看lowmemorykiller.c中这张默认的阈值表:
Lowmeme_adj中各项数值代表阈值的警戒级数,lowmem_minfree代表对应级数的剩余内存。
也就是说,当系统的剩余内存为小于6MB时候,警戒级数为0,当系统内存剩余小于8M而大于
6M的时候,警戒级数为1,当内存小于64M大于16MB的时候,警戒级数为12.
OK,现在我们来看具体代码,也就是lowmem_shrink这个回调函数:
进程的oom_adj 小于警戒阈值,则无视。
获取这个进程所占用的内存大小tasksize,如果小于比我们当前选出进程的内存,则无视。
如果大于则选中这个进程:
经过for_each的遍历,selected 就是我们选出要释放掉的bad进程,它具有下面两个条件:
Oom_adj大于当前警戒阈值并且最大。
在同样大小的oom_adj中,占用内存最多。
最后,我们释放掉这个进程的内存,通过force_sig(SIGKILL, selected)来向进程发送一个不可以忽略或阻塞的SIGKILL信号。
阈值表可以通过/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree进行配置,例如在init.rc中:
# Write value must be consistent with the above properties.
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
write /proc/sys/vm/overcommit_memory 1
write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144
class_start default
进程oom_adj同样可以进行设置,通过write /proc/<PID>/oom_adj ,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
Low memory killer的基本原理我们应该弄清了,正如我前面所说的,进程omm_adj的大小是跟进程的类型以及进程被调度的次序有关。进程的类型,可以在ActivityManagerService中清楚的看到:
static final int EMPTY_APP_ADJ;
static final int HIDDEN_APP_MAX_ADJ;
static final int HIDDEN_APP_MIN_ADJ;
static final int HOME_APP_ADJ;
static final int BACKUP_APP_ADJ;
static final int SECONDARY_SERVER_ADJ;
static final int HEAVY_WEIGHT_APP_ADJ;
static final int PERCEPTIBLE_APP_ADJ;
static final int VISIBLE_APP_ADJ;
static final int FOREGROUND_APP_ADJ;
static final int CORE_SERVER_ADJ = -12;
static final int SYSTEM_ADJ = -16;
ActivityManagerService定义各种进程的oom_adj,CORE_SERVER_ADJ代表一些核心的服务的omm_adj,数值为-12,由前面的分析可知道,这类进程永远也不会被杀死。
其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
由此我们知道EMPTY_APP 最容易被杀死,其实是CONTENT_PROVIDER ,FOREGROUND的进程很难被杀死。
现在我们再来说影响oom_adj的第二个因素,进程的调度次序。这涉及到了ActivityManagerService的复杂调度,我们下次再来看吧。呵呵。
See you next time !!!
Android Low memory killer by 永远的伊苏相关推荐
- Android low memory killer 机制
Android中,进程的生命周期都是由系统控制的.即使用户在界面上关掉一个应用,切换到了别的应用,那个应用的进程依然是存在于内存之中的.这样设计的目的是为了下次启动应用能更加快速.当然,随着系统运行时 ...
- 深挖android low memory killer
对于PC来说,内存是至关重要.如果某个程序发生了内存泄漏,那么一般情况下系统就会将其进程Kill掉.Linux中使用一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制 ...
- android的oomkiller_Android Low memory killer
Android Low memory killer by 永远的伊苏 Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中.这样设计的目的是为了下次能快速启动 ...
- Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)
更新 ActivityManagerService.updateOomAdjLocked 保存 /proc/pid/oom_adj /proc/pid/oom_score_adj /proc/pid/ ...
- 【Android 进程保活】Low Memory Killer 机制
文章目录 一.Low Memory Killer 机制 二.Low Memory Killer 参数 一.Low Memory Killer 机制 Android 中有一套 Low Memory Ki ...
- linux内核如何修改lowmem,技术内幕:Android对Linux内核的增强 Low Memory Killer
6 09 2013 技术内幕:Android对Linux内核的增强 Low Memory Killer Low Memory Killer(低内存管理) 对于PC来说,内存是 至关重要.如果某个程序发 ...
- android app打开另一个app并触发按钮_Android进程调度:Low memory killer(4)修改版
相关源码文件:framework/base/service/core/java/com/android/server/am/ActiveServices.javaframework/base/serv ...
- android lmk机制,android LMK(low memory killer) 工作机制
Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存. 那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low memory killer机制. Low memor ...
- android 杀死进程回收资源,Android之进程回收机制LMK(Low Memory Killer)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...
最新文章
- 一分钟帮你提升Android studio 编译速度
- 香河php程序员_失控的香河最流行的四大职位
- boost::isomorphism用法的测试程序
- 基于syslog+logstash+elasticSearch+redis日志分析系统实现
- html5访问电脑或手机摄像头
- Google Docs API 发布,自动化文档处理
- paho.mqtt.c的Linux编译与交叉编译
- nmake的调用方法
- 2023年入学华东师范大学MBA提前面试流程及时间-文都管联院
- 服务器怎么预防常见的网络攻击
- M1-CORO-S7 MANIP Modeling of Manipulators(1)
- 如何像Python高手(Pythonista)一样编程
- Shader Blend混合效果
- CentOS: Kernel panic - not syncing: Fatal exception
- ONVIF工具使用说明
- 【Web技术】1091- 跨浏览器窗口 ,7种方式,你还知道几种呢?
- 如何从A页面跳转到B页面并且带着很长的参数
- ioctl函数详细说明(网络)
- BIOS知识枝桠——Event
- 利用Docker和宝塔搭建FRP内网穿透