学习android内核 -- 内存管理相关
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内核 -- 内存管理相关的更多相关文章
- Linux内核学习笔记——内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- linux内核--内核内存管理
如题目所示,为什么要称作“内核内存管理”,因为内核所需要的内存和用户态所需要的内存,这两者在管理上是不一样的. 这篇文章描述内核的内存管理,用户态的内存管理在以后的文章中讲述. 首先简单的说明一下下面 ...
- 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩
百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...
- Linux内核内存管理架构
内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要 ...
- XV6学习笔记(2) :内存管理
XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...
- Android 之 内存管理-查看内存泄露(三)
概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...
- Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo
slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...
- (笔记)Linux内核学习(九)之内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
随机推荐
- Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
原文 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Win ...
- activity横屏竖屏的切换
原理: 其实总结起来,我们可以得到以下的一些结论 1.当内存不足(不容易模拟).切屏时会调用onSaveInstanceState().onRestoreInstanceState()方法 对于onS ...
- CCIE路由实验(7) -- MPLS VPN
1.LDP协议的各种情况2.LDP和BGP交互3.LDP高级部分4.MPLS VPN (RIP和静态)5.MPLS VPN (EIGRP)6.MPLS VPN (OSPF)7.MPLS VPN (EB ...
- ajaxSubmit提交文件表单不执行success
先描述一下我遇到的问题,系统里所有的表单都用ajaxSubmit来提交,成功回调success函数,普通表单都是没有问题的,但是有文件上传的表单就不行了,不会回调success,经验证会回调compl ...
- Android 之SparseArray<E>详解
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...
- 王立平-- ContentValues , HashTable , HashMap差别
ContentValues :是一种存储机制,key-value 特点:key仅仅能是string类型.value:仅仅能是基本类型,不能是对象. 应用:经常使用语往数据库中插入数据 Content ...
- linux工具:ssh---未完
ssh server_ip 或者 ssh username@server_ip 或者 ssh username@server_name , 再按提示输入密码. ____________________ ...
- “/” 应用程序中的服务器错误 - IIS 发布错误
解决方法, 将bin目录下的全部文件复制到iis下
- 类作为返回类型 ,具有java特点-封装等 而且应用起来很方便。
public class StudentDao { public Student getStudent(){ Student stu = new Student(); stu.setName(&quo ...
- attachEvent和addEventListener详解
attachEvent方法可以动态的为网页内的元素添加一个事件.通常你想为某个按扭添加一个单击事件时.你都会在按扭内写上onclick=事件名称.使用attachEvent则不必这样做.你把写好的事件 ...