学习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位系统:页 ...
随机推荐
- 你知道hover、active这四个伪类为什么要按顺序写吗
刨根问底,你知道:hover等4个伪类为什么要按顺序排列吗 引言 :link,:visited,:hover,:active这4个伪类大家都不陌生,4个伪类要按照LvHa这个爱恨原则来排(外国友人起的 ...
- Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)
所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也 ...
- Mysql主从配置+读写分离(转)
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. 注:安装前须查看是否已经安装了 ...
- Android项目实战手机安全卫士(02)
目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01. SplashActivity.java package com.coderdream.mobilesafe.acti ...
- python验证码识别
关于利用python进行验证码识别的一些想法 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处 理,然后 ...
- aix网络管理
lsdev -Cc adapter | grep ent 列出网卡 lsdev -Cc adapter 或者lscfg | grep -i adpter 显示已经安装的网卡 lsdev -Cc i ...
- YT工作日志-0911
上午 在导师的帮助下,帮我从svn上下载了项目.但是因为项目太大(不算jar包有730M),很多模块不是我工作中涉及的,但是运行的时候会报错,所以导师还帮我找了很多错误.把那些不需要的东西注释了.就这 ...
- Swift Error fatal error: unexpectedly found nil while unwrapping an Optional value
致命的错误: 对一个为空的optional值进行解包. 强制解包(forced unwrapping): 在optional后面加叹号. 比如 "value!" 错误代码: le ...
- Goodle Clean设计架构
Goodle Clean设计架构 23 * @param <P> the response type 24 */ 25 public abstract class UseCase<Q ...
- virtualbox从.VDI备份文件新建/恢复虚拟机(包括恢复各个备份节点)
一.前言: ubuntu上的virtualbox中的虚拟机如果关机不当会导致整个虚拟机坏掉,而且采用各种debug方式都难以让它重新启动.这时你只能用之前备份的各个VDI文件来恢复系统了.还有另一种场 ...