android lmk机制,android LMK(low memory killer) 工作机制
Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。
那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low memory killer机制。
Low memory killer 则是定时进行检查。
Low memory killer主要是通过进程的oom_adj来判定进程的重要程度。这个值越小,程序越重要,被杀的可能性越低。
oom_adj的大小和进程的类型以及进程被调度的次序有关。
Low memory killer 的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c
1.oom_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进行配置的:
在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
配置文件有如下两个:
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller /parameters/minfree
owmeme_adj中各项数值代表阈值的警戒级数,
lowmem_minfree代表对应级数的剩余内存。
adj文件存放着oom_adj 内存警戒值( 以4K为单位) 0 1536 1 2048 2 4096 7 5120 14 5632 15 6144
也就是说,当系统的剩余内存为小于6MB时候,警戒级数为0,当系统内存剩余小于8M而大于 6M的时候,警戒级数为1,当内存小于64M大于16MB的时候,警戒级数为12.
对于某些小内存设备,我们可以调整对应的门限值,例如: 一般调整后三个值。 echo “1536,2048,4096,15360,17920,20480″>/sys/module/lowmemorykiller/parameters/minfree
原文作者:AndyTsui
原文链接:http://blog.csdn.net/AndyTsui/archive/2011/02/27/6210653.aspx
2.LMK的工作机制
LMK开始工作时,
首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。
然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。
最关键的一步就是,发送SIGKILL信息,杀掉该进程。
3.tips
(1)在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
(2)进程oom_adj同样可以进行设置,通过write /proc//oom_adj,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16 (3)dumpsys activity可以dump进程的信息,查看adj值
procrank可以查看进程占用内存大小
android lmk机制,android LMK(low memory killer) 工作机制相关推荐
- android 杀死进程回收资源,Android之进程回收机制LMK(Low Memory Killer)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...
- 【Android 进程保活】Low Memory Killer 机制
文章目录 一.Low Memory Killer 机制 二.Low Memory Killer 参数 一.Low Memory Killer 机制 Android 中有一套 Low Memory Ki ...
- 深挖android low memory killer
对于PC来说,内存是至关重要.如果某个程序发生了内存泄漏,那么一般情况下系统就会将其进程Kill掉.Linux中使用一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制 ...
- Android low memory killer 机制
Android中,进程的生命周期都是由系统控制的.即使用户在界面上关掉一个应用,切换到了别的应用,那个应用的进程依然是存在于内存之中的.这样设计的目的是为了下次启动应用能更加快速.当然,随着系统运行时 ...
- android app打开另一个app并触发按钮_Android进程调度:Low memory killer(4)修改版
相关源码文件:framework/base/service/core/java/com/android/server/am/ActiveServices.javaframework/base/serv ...
- LMK(Low Memory Killer)
Low Memory Killer 进程按照状态分完重要性之后,就要开始杀进程了.Android的Low Memory Killer基于Linux的OOM机制,在Linux中,内存是以页面(page) ...
- linux内核如何修改lowmem,技术内幕:Android对Linux内核的增强 Low Memory Killer
6 09 2013 技术内幕:Android对Linux内核的增强 Low Memory Killer Low Memory Killer(低内存管理) 对于PC来说,内存是 至关重要.如果某个程序发 ...
- Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)
更新 ActivityManagerService.updateOomAdjLocked 保存 /proc/pid/oom_adj /proc/pid/oom_score_adj /proc/pid/ ...
- android的oomkiller_Android Low memory killer
Android Low memory killer by 永远的伊苏 Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中.这样设计的目的是为了下次能快速启动 ...
最新文章
- c 语言26个小写字母,26个字母表大小写
- linux后缀为tar.xz,xz后缀名文件解压方法
- 荣耀x10max鸿蒙,黄石收购荣耀X10Max指纹键电池背光喇叭
- 【数学基础】拉格朗日对偶
- Nginx 实现网站 http、https 配置
- Java学习日报—2021/11/18
- java 华氏度_在Java中将华氏度转换为摄氏温度[重复] - java
- java u0002_老玩法,输出金字塔
- endnote 参考文献加序号_EndNote同一文章的插入不同编号参考文献的方法 | 科研动力...
- Android精品开源项目整理_V20140221(持续更新中..)
- ADS仿真学习:s2p文件导入ADS
- 日程表模板html,excel日程表模板(每日工作时间表模板)
- dns配置异常怎么修复_DNS错误怎么办(如何正确设置DNS)
- BUUCTF笔记之Basic部分WP
- 科幻文学入门指南(专业读者分享)
- js面试必备:原形链
- HDU 5234 DP背包
- 5G LTE窄带物联网(NB-IoT) 6
- docker中调试失败
- 帝国php调用文章列表,帝国CMS模板中:使用php调用最新文章的代码(非灵动和万能标签)...
热门文章
- 谷哥翻译,你敢随随便便相信吗?
- spring 集成kafka:java.lang.NoSuchMethodError: org.springframework.util.Assert.state
- Android Service后台下载 广播(Eventbus)通知并展示
- U盘标注的容量不真实的原因
- 纯手码 | 基于OpenCV的车牌识别(Sobel、颜色定位),绝对实用
- ATool软件使用实验(22)
- Eclipse 设置单个项目编码以及设置所有项目编码
- HE染色分割图像文献阅读总结(一)
- 合工大c语言考题及答案,合肥工业大学大学物理试题答案
- 在支付圈里混不懂这些行业术语 都没脸说自己是做支付的!