Android分析之LowMemoryKiller

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/<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

(3)dumpsys activity可以dump进程的信息,查看adj值

   procrank可以查看进程占用内存大小

【Android】LMK 工作机制的更多相关文章

  1. Android进阶——Android视图工作机制之measure、layout、draw

    自定义View一直是初学者们最头疼的事情,因为他们并没有了解到真正的实现原理就开始试着做自定义View,碰到很多看不懂的代码只能选择回避,做多了会觉得很没自信.其实只要了解了View的工作机制后,会发 ...

  2. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

  3. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  4. Android事件分发机制三:事件分发工作流程

    前言 很高兴遇见你~ 本文是事件分发系列的第三篇. 在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activit ...

  5. 【原创】源码角度分析Android的消息机制系列(五)——Looper的工作原理

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. Looper在Android的消息机制中就是用来进行消息循环的.它会不停地循环,去MessageQueue中查看是否有新消息,如果有消息就立刻 ...

  6. 【原创】源码角度分析Android的消息机制系列(二)——ThreadLocal的工作过程

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一篇文章中,我们已经提到了ThreadLocal,它并非线程,而是在线程中存储数据用的.数据存储以后,只能在指定的线程中获取到数据,对于其 ...

  7. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  8. android的消息处理机制——Looper,Handler,Message

    在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...

  9. 讲讲Android事件拦截机制

    简介 什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件.当点击一个按钮时,通常会产生两个或者三个事件--按钮按下,这是事件一,如果滑动几下,这是事件二,当手抬起,这是事件三.所以在And ...

随机推荐

  1. AviSynth AVS Importer Plugin for Adobe Premiere Pro CC 2015 x64

    Premiere CS AVS Importer x64.prm copy to Adobe\Adobe Premiere Pro CC 2015\Plug-Ins\Common\ VSFilterM ...

  2. Struts2框架下的文件上传文件类型、名称约定

    Struts2框架下的文件上传机制:1.通过multipart/form-data form提交文件到服务器2.文件名是通过什么地方设置的?在strust2的FileUploadInterceptor ...

  3. c 中打印格式%g

    C语言中打印float或double类型最常用的是%f格式,最近看书时看到有使用%g格式打印. %f  表示按浮点数的格式打印. 小数点后固定6位 %e 表示以指数形式的浮点数格式输出. %g 表示自 ...

  4. ansible结合zabbix_api批量添加主机

    批量添加zabbix监控 .使用ansible配置zabbix客户端 ①修改服务器的IP(域名),为了方便使用ansible来批量操作 等同于如下sed语句 sed -i 's#Server=1.1. ...

  5. 通过zabbix自带api进行主机的批量添加操作

    通过zabbix自带api进行批量添加主机 我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix ...

  6. MinGW-w64非官方编译器集成安装包(很清楚)

    官方链接[编辑] MinGW 官方网站. SourceForge.net上的MinGW官方的下载站点(Win32系统). MinGW-w64官方的下载站点[编辑] MinGW-w64是2005年由On ...

  7. Python-数据库 基本SQL语句

    1. 数据库是什么 2. MySQL安装 3. 用户授权 4. 数据库操作 - 数据表 - 数据类型 - 是否可以为空 - 自增 - 主键 - 外键 - 唯一索引 数据行 增 删 改 查 排序: or ...

  8. python-基于UDP通信的套接字,socketserver模块的使用

    一.基于UDP协议通信的套接字 udp是没有链接的,所以先启动哪一端都不会报错 import socket server=socket.socket(socket.AF_INET,socket.SOC ...

  9. 原来商家登录系统的commonjs

    /* *适配 */ //orientationchange方向改变事件 (function (doc,win) { var docEl = doc.documentElement,//根元素html ...

  10. js-循环中判断两次点击是否是同一元素

    $(elm).click(function(){ if($(this).attr('num')){ console.log("同一个元素") }else{ for(let i=0; ...