Android内存管理:

1.当应用程序关闭以后,后台对应的进程并没有真正的退出(处于休眠状态,一般不占用系统CPU的资源),这是为了下次再启动的时候能快速启动。

2.当系统内存不够时,AmS会主动根据一定的优先规则退出优先级较低的进程。

a:与linux内核的内存管理模块配合: 系统内存情况(是否足够)主要是Linux内核的内存管理所控制的,AmS只是从中起到为应用程序情况分配一个oom_adj值(-16到15,android中只用了0-15 ;值越高越容易被回收),然后告诉Linux内核中注册的oom killer去做回收处理(调用linux内部的进程管理方法)。              (如果不支持这种方式,则进行潜规则)

b:潜规则(后台进程):回收优先级为   包含        前台Activity < 前台Service 或 Provider < 后台 activity < 空进程     (即前台Activity是最不容易被回收的);

c: 当Activity数量超过定义的MAX_ACTIVITES(20)时, 满足 处于stop(),还没有finish();     并是不可见的;      不是persistent(常驻进程)的;  也是最优先被kill的。

主要流程为:

1.android中运行了一个叫oom的进程,他会在linux内存管理中注册(为oom Killer:用来回收应用进程)。

2.当Llinux内存管理模块检测到系统内存不够的时候,他就会通知注册了的OOM进程,然后OOM进程就可以根据所定义的各种规则进行内存释放了。

-------------------------------------

内存回收释放的地点包含三个:

1.AmS中:当系统内存低时,会根据上述潜规则进行释放。 Process.killProcess(...)

2.OOM Killer中:根据oom_adj值调用Linux内部的进程管理方法释放优先级较低的进程。(oom_adj越高,优先级越低)

3.应用本身:当AmS认为目标进程需要被杀死时,首先会通知目标进程进行内存释放,包括调用目标进程的 scheduleLowMemory() 和 processInBackground() 方法

-------------------------------------

调用回收:

1.ActivityStack类的activityIdleInternal()方法 :该方法只是执行通知所有需要回收内存的客户进程进行内存回收以及执行了一些回调,并没有真正的回收处理,真正做内存回收工作是调用了trimApplications()

2.ActivityServiceManager类的trimApplications():该方法执行真正的内存回收处理;该方法在activityIdleInternal()以及stopActivityLocked()中被调用。

执行顺序为上述的 a b c,在这之前还会先删除mRemovedProcesses列表中记录的进程 ,如下情况会被加入到列表中

1.当某个进程crash后。

2.当某个程序UI线程5秒之内没响应,弹出ARN,如选择强制关闭。

3.手动调用Ams提供的killBackgroundProcess(),需要添加权限。

4.当系统启动时,在Ams的systemReady()方法中,启动非persistent(常驻)进程,一般都是常驻的,基本不会发生)

3. trimApplications()中的Boolean updateOomAdjLocked()->setOomadj():告诉OOM Killer指定进程的优先级,如果底层的Linux系统包含OOM Killer则返回true(说明支持OOM Kille),否则为false。

4.computeOomAdjLocked()估算指定进程的oom_adj值

学习android内核 -- 内存管理相关的更多相关文章

  1. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  2. linux kernel学习笔记-5内存管理_转

    void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...

  3. linux内核--内核内存管理

    如题目所示,为什么要称作“内核内存管理”,因为内核所需要的内存和用户态所需要的内存,这两者在管理上是不一样的. 这篇文章描述内核的内存管理,用户态的内存管理在以后的文章中讲述. 首先简单的说明一下下面 ...

  4. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  5. Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要 ...

  6. XV6学习笔记(2) :内存管理

    XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...

  7. Android 之 内存管理-查看内存泄露(三)

    概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...

  8. Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo

    slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...

  9. (笔记)Linux内核学习(九)之内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

随机推荐

  1. 14 - XML、JSON、PLIST对比和APP生命周期

    XML中间的 数据表达/传输数据的语言 优点:特别强大 强大到很多平台都有基于XML的独立语言,如MXML.HTML 缺点:传输小型数据时,特别啰嗦 size / speed = time JSON ...

  2. android开发中防止刚进入activity时edittext获取焦点,自动弹出软键盘

    刚进入activity的时候,如果布局组件有edittext的话,往往edittext会获取焦点,自动弹出软键盘,影响整个界面的视觉效果.解决方法如下:   可以在edittext的父布局结构中(例如 ...

  3. html:打开新的页面

    在html页面中,打开一个新的页面,有两种方式: 一.利用超链接 <a href="newurl">新页面</a> 上面代码添加了一个新链接,点击链接时会打 ...

  4. 基于mAppWidget实现手绘地图--索引&DEMO

    文章翻译完了,梳理一下,附Demo下载 基于mAppWidget实现手绘地图(一)–简介 基于mAppWidget实现手绘地图(二)–概要 基于mAppWidget实现手绘地图(三)–环境搭建 基于m ...

  5. How to Create Dump File for Applications

    使用WinDBG这个工具,可以在应用程序异常终止或者无响应时获取它的尸体,以用来解剖研究. Creating Dump File      在Vista环境中抓取Dump文件很方便,在task man ...

  6. KMP算法 KMP模式匹配 一(串)

    A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB  ...

  7. HDU5090模拟,hash

    /* HDU 5090 算是一道简单模拟题.但当中有非常深的hash思想 这是本人的第一道hash题 更是本人的第一道纸质代码不带编译不带执行提交AC的题 值得纪念 废话讲这么多之后,讲述题中思想 因 ...

  8. makefile 必知必会

    Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: <目标文件>: ...

  9. Java+7入门经典 - 6 扩展类与继承 Part 1/2

    第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...

  10. BMP文件结构

    1. 位图文件头 位图文件头包含有关于文件类型.文件大小.存放位置等信息,在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义: typedef struct ta ...