首先Android理机制相当复杂。想要讲清楚比較困难。其次对于绝大多数用户来说。仅仅关心内存够不够用,至于内存怎样管理的这样的技术细节,不是用户须要去考虑的,写这样一个专题有没有意义?毕竟我们是用手机,不是来研究手机的。

最后的顾虑是这个专题会不会太技术化了。绝大部分用户不会看或者说缺乏对应的背景。

可是有一种激励促使着我去写这样一个专题,一直以来,MIUI团队在与用户互动的过程中也同一时候在向用户学习。你们的一些建议或者点子总会给我们启发,这个专题中我相信你们相同能给以启发。尽管说内存管理是一个非常技术的话题,但我们仍能够从用户的角度去看这些问题,内存管理是怎样影响我们使用手机,作为用户,我们能做些什么。我会尽力使这样一个专题不那么技术化。可是仍旧免不了会有一些技术术语以及实现相关的讨论,假设有兴趣。我们就一起看看吧。



我们首先从用户发的一个帖子開始:“传说中的神器。让你的ms时刻保持空余内存”。在这个帖子中提到了"alter
minfree"选项,在这一篇中我们就讲讲这个是什么。它是怎样工作的。



(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。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Android内存管理的更多相关文章

  1. Android内存管理机制之一:low memory killer

    转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...

  2. Android 内存管理分析(四)

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

  3. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

  4. 浅谈Android内存管理

    最近在网上看了不少Android内存管理方面的博文,但是文章大多都是就单个方面去介绍内存管理,没有能全局把握,缺乏系统性阐述,而且有些观点有误,仅仅知道这些,还是无法从整体上理解内存管理,对培养系统优 ...

  5. [Android Memory] Android内存管理、监测剖析

    转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Ki ...

  6. Android——内存管理基础

    内存收集概念 内存垃圾收集器(garbage collector) 概念:自定内存管理. 功能:分配内存.保证所有被引用的对象还在内存中.可以释放在运行的代码中不再引用的对象的内存. 垃圾收集器避免了 ...

  7. Android 内存管理 &Memory Leak & OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  8. 【原创】Android内存管理-OnTrimMemory

    Application中有两个与内存管理相关的方法:onLowMemory()和 onTrimMemory(int level),源码如下 @CallSuper public void onLowMe ...

  9. 【原创】android内存管理-内存泄漏原因

    转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5704596.html 先讲一下内存泄漏的概念:内存泄露是指无用对象持续占有内存,或者内存得不到及时 ...

  10. Android内存管理机制

    相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确实是一门必不可少的能力. 今天我们就谈谈在Android平台下内存的管理之道,开始 ...

随机推荐

  1. 趋势科技4月移动client病毒报告

    2014年4月移动client安全威胁概况 截至2014年4月30日,中国区移动client病毒码1.669.60,大小9,792,484字节,能够检測病毒约221万个.移动client病毒约12万个 ...

  2. WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成

    原文:WCF技术剖析之七:如何实现WCF与EnterLib PIAB.Unity之间的集成 在这之前,我写过深入介绍MS EnterLib PIAB的文章(参阅<MS Enterprise Li ...

  3. CSDN-Code平台使用过程中的5点经验教训

    昨天又创建了一个项目,fucms,可是本地一直没有权限提交,搞了非常久,试了几十次,都不行,我是非常的灰心和郁闷.  刚刚,和CSDN-Code的官方客服咨询了非常久非常久,最终摸索出来了一些心得体会 ...

  4. 50个Android开发技巧(11 为文字加入特效)

    问题:怎样构建一个模拟LED数字时钟的页面?效果例如以下图所看到的: (原文地址:http://blog.csdn.net/vector_yi/article/details/24460227) 分析 ...

  5. LINQ to SQL的一些简单用法

    static void Main(string[] args) { var personList = new List<Person> { new Person() { PersonID= ...

  6. 简单的javascript抽奖程序

    <html>  <head>   <title>手机号码抽奖程序</title>   <script>    //声明一个数组装住号码,可根 ...

  7. 如果一个Object对象可能是数组那么如何对其进行迭代

    需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个 ...

  8. Servlet的学习之ServletContext(2)

    本篇接上篇<Servlet的学习(五)>,继续从ServletContext对象中的方法进行学习,在这一篇中,我们重点关注的是ServletContext对象中对于在web工程中的资源文件 ...

  9. php 控制页面跳转

    <?php class UserAction extends Action{ public function index(){ echo "你好!"; $m=M('user' ...

  10. OpenVPN多处理之-netns容器与iptables CLUSTER

    假设还是沉湎于之前的战果以及强加的感叹,不要冥想,将其升华. 1.C还是脚本 以前,我用bash组织了复杂的iptables,ip rule等逻辑来配合OpenVPN,将其应用于差点儿全部能够想象得到 ...