`

Android内存管理机制之一:lowmemory killer

 
阅读更多

http://blog.csdn.net/rio2012/article/details/6186125

 

(1)Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因 此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内 存肯定会出现不足,这个时候Android系统开始挥舞屠刀杀程序。这里就有一个很明显的问题,杀谁?

(2)Android系统中杀程序 的这个刽子手被称作"LowMemory Killer",它是在Linux内核中实现的。这里它实现了一个机制,由程序的重要性来决定杀谁。通俗来说,谁不干活,先杀谁。Android将程序的 重要性分成以下几类,按照重要性依次降低的顺序:

名称 oom_adj 解释
FOREGROUD_APP 0 前台程序,可以理解为你正在使用的程序
VISIBLE_APP 1 用户可见的程序
SECONDARY_SERVER 2 后台服务,比如说QQ会在后台运行服务
HOME_APP 4 HOME,就是主界面
HIDDEN_APP 7 被隐藏的程序
CONTENT_PROVIDER 14 内容提供者,
EMPTY_APP
15
空程序,既不提供服务,也不提供内容


其中每个程序都会有一个oom_adj值,这个值越小,程序越重要,被杀的可能性越低。

(3)除了上述程序重要性分类之外,Android系统还维护着另外一张表,这张表是一个对应关系,以N1为例:

oom_adj 内存警戒值( 以4K为单位)
0 1536
1 2048
2 4096
7 5120
14 5632
15 6144

这个表是定义了一个对应关系,每一个警戒值对应了一个重要性值,当系统的可用内存低于某个警戒值时,就杀掉所有大于该警戒值对应的重要性值的程序。 比如说,当可用内存小于6144 * 4K = 24MB时,开始杀所有的EMPTY_APP,当可用内存小于5632 * 4K = 22MB时,开始杀所有
的CONTENT_PROVIDER和EMPTY_APP。


(4) alter minfree改的是什么呢,上面这张对应表是由两个文件组成的:
/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree。

alter minfreee就是修改/sys/module/lowmemorykiller/parameters/minfree这个文件的,举例来说,如果把最后一项改为32 * 1024,那么当可用内存小于128MB是,就开始杀所有的EMPTY_APP。

分享到:
评论
1 楼 laiyangdeli 2012-02-08  
Android Low Memory Killer介绍
基本原理:

Android的Low Memory Killer是在标准linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存。Bad进程的选择标准有两个:oom_adj和占用内存的大小。oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阈值。Android Kernel每隔一段时间会检查当前空闲内存是否低于某个阈值,如果是,则杀死oom_adj最大的Bad进程,如果有两个以上Bad进程oom_adj相同,则杀死其中占用内存最多的进程。 

Low Memory Killer与OOM的区别

OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:

OOM基于多个标准给每个进程打分,分最高的进程将被杀死;Low MemoryKiller则用oom_adj和占用内存的大小来选择Bad进程,OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。

Low Memory Killer的实现

Low Memory Killer的源代码在drivers/staging/Android/lowmemorykiller.c中,它是通过注册Cache Shrinker来实现的。Cache Shrinker是标准linux kernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,kswapd会调用注册的Shrinker回调函数,来回收内存页面。

Low Memory Killer是在模块初始化时注册Cache Shrinker的,代码如下:

static int__init lowmem_init(void)

{

register_shrinker(&lowmem_shrinker);//注册Cache Shrinker

return 0;

}

lowmem_shrinker的定义如下:

static struct shrinker lowmem_shrinker=

{

.shrink=lowmem_shrink,

.seeks=DEFAULT_SEEKS*16

};

register_shrinker会将lowmem_shrink加入Shrinker List中,被kswapd在遍历Shrinker List时调用,而Low Memory Killer的功能就是在lowmem_shrink中实现的。

lowmem_shrink用两个数组作为选择Bad进程的依据,这两个数组的定义如下:

static int lowmem_adj[6]=

{

0,

1,

6,

12,

};

static int lowmem_adj_size=4;

static size_t lowmem_minfree[6]={

3*512,//6MB

2*1024,//8MB

4*1024,//16MB

16*1024,//64MB

};

lowmem_minfree保存空闲内存的阈值,单位是一个页面4K,lowmem_adj保存每个阈值对应的优先级。lowmem_shrink首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。

lowmem_shrink杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL信号:

force_sig(SIGKILL,selected);



用户接口

设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口:/proc/<进程pid>/oom_adj。

Android启动时读取的配置文件/init.rc中定义了相应的属性供AP使用并有设置这些参数:

#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.BACKUP_APP_ADJ 2

setprop ro.HOME_APP_ADJ 4

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.BACKUP_APP_MEM 4096

setprop ro.HOME_APP_MEM 4096

setprop ro.HIDDEN_APP_MEM 5120

setprop ro.CONTENT_PROVIDER_MEM 5632

setprop ro.EMPTY_APP_MEM 6144

#Write value must be consistent with the above properties.

#Note that the driver only supports 6 slots,so we have HOME_APP

at the

#same memory level as services.

write/sys/module/lowmemorykiller/parameters/adj

0,1,2,7,14,15

write/sys/module/lowmemorykiller/parameters/minfree

1536,2048,4096,5120,5632,6144

#Set init its forked children's oom_adj.

write/proc/1/oom_adj-16

从以上设置可以看出,将init进程oom_adj设置为-16,从而保证init进程永远不会被杀掉

相关推荐

    Acronis Backup:Acronis备份策略设计原理.docx

    Acronis Backup:Acronis备份策略设计原理.docx

    phpEasyVCS-2.0.zip

    phpEasyVCS-2.0.zip

    2023-04-06-项目笔记 - 第三百五十一阶段 - 4.4.2.349全局变量的作用域-349 -2025.12.18

    2023-04-06-项目笔记-第三百五十一阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.349局变量的作用域_349- 2024-12-18

    【BP回归预测】基于matlab非洲秃鹫算法优化BP神经网络AVOA-BP光伏数据预测(多输入单输出)【Matlab仿真 5152期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于java的狄氏皮草服装店销售管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    用户管理: 能够完成用户基本信息录入的注册和用户基本信息的修改。 管理员管理: 能够完成管理员对网站的商品信息管理(商品添加、商品审查)、会员管理(会员审查)、网站信息管理(新闻添加、修改删除、公告设置),以及常规设置(广告添加,友情链接)的功能。 搜索功能: 能过电子商品的名称进行搜索。 查询功能: 能够通过查看购物车对所选商品进行确定、挑选。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat

    BLE蓝牙单片机CC2540、CC2541带OSAL操作系统的项目实战开发例程-蓝牙游戏手柄例程(空中鼠标键盘、体感游戏手柄).zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2540/CC2541上运行,如果是其他型号芯片,请自行调整。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    【BP回归预测】基于matlab哈里斯鹰算法优化BP神经网络HHO-BP光伏数据预测(多输入单输出)【Matlab仿真 5155期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【BP回归预测】基于matlab飞蛾扑火算法优化BP神经网络MFO-BP光伏数据预测(多输入单输出)【Matlab仿真 5151期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    IO总结总结总结总结总结

    IO总结总结总结总结总结

    基于java的人人乐超市采购管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    系统能够对客户信息管理、订单管理、商品信息管理、供应商管理、库存管理,系统用户管理等信息提供存储、更新、查询、统计的功能。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat

    基于java的视频教学考试网源代码(完整前后端+mysql+说明文档+LW).zip

    前台模块: 站内新闻:发布与视频教学相关的新闻和动态。 视频学习:提供视频教学内容,供用户学习。 在线留言:用户可以在线提交留言或反馈。 用户注册:允许新用户注册成为网站的会员。 在线论坛:提供一个在线讨论的平台。 资料下载:提供学习资料或其他相关文件的下载服务。 管理员模块: 系统用户管理:管理系统用户的账户信息。 注册用户管理:管理注册用户的资料和信息。 教师信息管理:管理教师的资料和信息。 站内新闻管理:管理网站新闻内容的发布和更新。 课程信息:管理课程的相关信息。 资料下载管理:管理可供下载的资料。 论坛管理:管理在线论坛的内容和用户互动。 注册用户模块: 教师资料修改:教师可以修改自己的个人信息。 作业发布管理:用户可以发布作业或相关任务。 在线资料下载:注册用户可以下载在线资料。 学生资料管理:学生可以管理自己的资料。 学生下载作业:学生可以下载教师发布的作业。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat

    汉普美的ERP简介、实施、应用.ppt

    汉普美的ERP简介、实施、应用.ppt

    深圳混泥土搅拌站资金、现金、费用管理规定.docx

    深圳混泥土搅拌站资金、现金、费用管理规定

    worldgroup manager(瀛海威时空客户端英文原版)

    98年的telnetBBS软件,配合worldgroup server使用(16位),是瀛海威时空客户端的英文原版。

    5aaaaaaaaaaaaaaaaaaaaaa

    5aaaaaaaaaaaaaaaaaaaaaa

    基础的Go微服务框架.zip

    这个项目是一个基础的Go微服务框架,适合作为微服务架构的学习项目。希望这个项目能帮助你入门Go语言的微服务开发!

    2024-2030中国核苷酸市场现状研究分析与发展前景预测报告 Sample Yuan.pdf

    此为报告样本,完整报告的框架结构

    传送带中大块煤识别检测数据集,使用coco json格式对792张图片标注

    传送带中大块煤识别检测数据集,使用coco json格式对792张图片标注,标注图片和标注信息可参考博文:https://backend.blog.csdn.net/article/details/144513245

    DLLDirectX文件快速修复工具

    此工具能快速有效的修复系统缺失的DLL和DirectX文件

    计算机组成原理课程设计(模型机).doc

    计算机组成原理课程设计(模型机).doc

Global site tag (gtag.js) - Google Analytics