Android内存管理机制之一:low memory killer
转载自http://www.miui.com/thread-29268-1-1.html
准备写这个专题之前,心里是有点忐忑的。首先Android内存管理机制相当复杂,想要讲清楚比较困难;其次对于绝大多数用户来说,只关心内存够不够用,至于内存如何管理的这种技术细节,不是用户需要去考虑的,写这样一个专题有没有意义?毕竟我们是用手机,不是来研究手机的。最后的顾虑是这个专题会不会太技术化了,绝大部分用户不会看或者说缺乏相应的背景。但是有一种激励促使着我去写这样一个专题,一直以来,MIUI团队在与用户互动的过程中也同时在向用户学习,你们的一些建议或者点子总会给我们启示,这个专题中我相信你们同样能给以启示。虽然说内存管理是一个很技术的话题,但我们仍可以从用户的角度去看这些问题,内存管理是如何影响我们使用手机,作为用户,我们能做些什么。我会尽力使这样一个专题不那么技术化,但是仍旧免不了会有一些技术术语以及实现相关的讨论,如果有兴趣,我们就一起看看吧。
我们首先从用户发的一个帖子开始:“传说中的神器,让你的ms时刻保持空余内存”,在这个帖子中提到了"alter minfree"选项,在这一篇中我们就讲讲这个是什么,它是如何工作的。
(1)Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内存肯定会出现不足,这个时候Android系统开始挥舞屠刀杀程序。这里就有一个很明显的问题,杀谁?
(2)Android系统中杀程序的这个刽子手被称作"Low Memory 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。
这个专题的第一贴就到此结束,我们大致的讲了一下在内核里是如何处理low memory的,当然,实际上内核中的内存管理非常复杂,也不可能在这样的一个帖子中去展开,下一篇我们跳出内核层,去应用层看看。
Android内存管理机制之一:low memory killer的更多相关文章
- Android进程回收机制LMK(Low Memory Killer)
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系 ...
- Android进程回收机制LMK(Low Memory Killer)【转】
本文转载自:http://www.cnblogs.com/wytiger/p/5744752.html 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正 ...
- Android内存管理机制
相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确实是一门必不可少的能力. 今天我们就谈谈在Android平台下内存的管理之道,开始 ...
- android 内存管理机制、异常、垃圾回收
当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”.从而使得用户调用程序时能够在第一时间得到响应. 当系统内存不足时,系统将激活内存 ...
- [Android Memory] Android内存管理、监测剖析
转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Ki ...
- Android中的内存管理机制以及正确的使用方式
概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...
- 【朝花夕拾】Android性能篇之(六)Android进程管理机制
前言 Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...
- 深挖android low memory killer
对于PC来说,内存是至关重要.如果某个程序发生了内存泄漏,那么一般情况下系统就会将其进程Kill掉.Linux中使用一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制 ...
- Android 内存管理 &Memory Leak & OOM 分析
转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...
随机推荐
- 使用MediaPlayer播放音频-----之一
MediaPlayer提供了如下方法来指定装载相应的音频文件: 1.void setDataSource( String path):指定装载path路径所代表的文件. 2.void setDa ...
- sql 如何过滤重复记录
distinct : select distinct ID from table1
- jquery 字数限制
$("#TextArea1").keydown(function(){ 10 var curLength=$("#TextArea1").val().lengt ...
- HTTP(socket)下载遇到valgrind提示的错误: Conditional jump or move depends on uninitialised value(s)
我写了个http下载函数,下载txt.jpg都正常,就是下载php有问题:valgrind会报错Conditional jump or move depends on uninitialised va ...
- Unity3d之MonoBehaviour的可重写函数整理
最近在学习Unity3d的知识.虽然有很多资料都有记录了,可是我为了以后自己复习的时候方便就记录下来吧!下面的这些函数在Unity3d程序开发中具有很重要的作用. Update 当MonoBehavi ...
- Countries in War (POJ 3114) Tarjan缩点+最短路
题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间. 解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...
- 蓝桥杯 BASIC_17 矩阵乘法 (矩阵快速幂)
问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N.M(1<=N<=30, 0& ...
- android 之 XMLPull
Pull解析 Pull的XML解析操作与SAX解析操作类似,也是采用事件驱动的方式.当XML文档开始解析或者遇到节点时都会有相应的事件代码触发. 主要涉及两个类: org.xmlpull.v1.Xml ...
- LOGISTIC REGRESSION
In logistic regression we learn a family of functions
- .net 找回密码的第一步 第二步 第三步的进程条
先写一个div作为存放这个进程条的容器 开始写js 根据jQuery选择器找到需要加载ystep1的容器 loadstep方法可以初始化 steps参数表示步骤名称,content则是鼠标移动到当前位 ...