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) 工作机制相关推荐

  1. android 杀死进程回收资源,Android之进程回收机制LMK(Low Memory Killer)

    熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...

  2. 【Android 进程保活】Low Memory Killer 机制

    文章目录 一.Low Memory Killer 机制 二.Low Memory Killer 参数 一.Low Memory Killer 机制 Android 中有一套 Low Memory Ki ...

  3. 深挖android low memory killer

    对于PC来说,内存是至关重要.如果某个程序发生了内存泄漏,那么一般情况下系统就会将其进程Kill掉.Linux中使用一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制 ...

  4. Android low memory killer 机制

    Android中,进程的生命周期都是由系统控制的.即使用户在界面上关掉一个应用,切换到了别的应用,那个应用的进程依然是存在于内存之中的.这样设计的目的是为了下次启动应用能更加快速.当然,随着系统运行时 ...

  5. android app打开另一个app并触发按钮_Android进程调度:Low memory killer(4)修改版

    相关源码文件:framework/base/service/core/java/com/android/server/am/ActiveServices.javaframework/base/serv ...

  6. LMK(Low Memory Killer)

    Low Memory Killer 进程按照状态分完重要性之后,就要开始杀进程了.Android的Low Memory Killer基于Linux的OOM机制,在Linux中,内存是以页面(page) ...

  7. linux内核如何修改lowmem,技术内幕:Android对Linux内核的增强 Low Memory Killer

    6 09 2013 技术内幕:Android对Linux内核的增强 Low Memory Killer Low Memory Killer(低内存管理) 对于PC来说,内存是 至关重要.如果某个程序发 ...

  8. Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)

    更新 ActivityManagerService.updateOomAdjLocked 保存 /proc/pid/oom_adj /proc/pid/oom_score_adj /proc/pid/ ...

  9. android的oomkiller_Android Low memory killer

    Android Low memory killer by 永远的伊苏 Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中.这样设计的目的是为了下次能快速启动 ...

最新文章

  1. c 语言26个小写字母,26个字母表大小写
  2. linux后缀为tar.xz,xz后缀名文件解压方法
  3. 荣耀x10max鸿蒙,黄石收购荣耀X10Max指纹键电池背光喇叭
  4. 【数学基础】拉格朗日对偶
  5. Nginx 实现网站 http、https 配置
  6. Java学习日报—2021/11/18
  7. java 华氏度_在Java中将华氏度转换为摄氏温度[重复] - java
  8. java u0002_老玩法,输出金字塔
  9. endnote 参考文献加序号_EndNote同一文章的插入不同编号参考文献的方法 | 科研动力...
  10. Android精品开源项目整理_V20140221(持续更新中..)
  11. ADS仿真学习:s2p文件导入ADS
  12. 日程表模板html,excel日程表模板(每日工作时间表模板)
  13. dns配置异常怎么修复_DNS错误怎么办(如何正确设置DNS)
  14. BUUCTF笔记之Basic部分WP
  15. 科幻文学入门指南(专业读者分享)
  16. js面试必备:原形链
  17. HDU 5234 DP背包
  18. 5G LTE窄带物联网(NB-IoT) 6
  19. docker中调试失败
  20. 帝国php调用文章列表,帝国CMS模板中:使用php调用最新文章的代码(非灵动和万能标签)...

热门文章

  1. 谷哥翻译,你敢随随便便相信吗?
  2. spring 集成kafka:java.lang.NoSuchMethodError: org.springframework.util.Assert.state
  3. Android Service后台下载 广播(Eventbus)通知并展示
  4. U盘标注的容量不真实的原因
  5. 纯手码 | 基于OpenCV的车牌识别(Sobel、颜色定位),绝对实用
  6. ATool软件使用实验(22)
  7. Eclipse 设置单个项目编码以及设置所有项目编码
  8. HE染色分割图像文献阅读总结(一)
  9. 合工大c语言考题及答案,合肥工业大学大学物理试题答案
  10. 在支付圈里混不懂这些行业术语 都没脸说自己是做支付的!