补充文章
https://cloud.tencent.com/developer/article/1029670
AMS 主要功能
1.统一调度各个 App 的 Activity
2.内存管理
3.进程管理
Android内存管理
- Android内存管理分为2个部分
- 应用程序关闭之后,后台对应的进程没有真正的关闭,以便下次快速的再启动(温启动)。
- 当系统内存不够时,Ams(ActivityManagerService)会主动根据一定的优先级规则退出优先级低的进程
关闭与退出
关闭是指进程对应的窗口不显示,而后台的进程还在保存。
Android 关闭的机制除了占用内存之外,基本上不会降低前台应用的程序。
消息分发机制
每一个App的对应一个 ActivityThread,该类初始化后就进入Looper.loop()的无限循环。
ActivityThread
1 | public static void main(String[] args) { |
之后则是靠消息分发机制运行,没有消息则会sleep,阻塞起来,直到有新的msg过来。
1 | public static void loop() { |
总结:在Linux的内核调度中,如果一个线程的状态为sleep,除了占用调用本身时间之外,不占用Cpu的时间片。
1 | Message msg = queue.next(); // might block |
被唤醒的3种情况
定时器中断
用户按键消息(消息线程)
Binder消息(Binder线程)
温启动
温启动时由于app的进程仍然存在,只执行冷启动第二阶段流程
1、创建app对象
2、启动主进程
3、创建MainActivity
4、渲染视图
5、执行onLayout
6、执行onDraw
温启动常见场景:
1、用户双击返回键退出应用
2、app由于内存不足被回收
Android 与 Linux 配合
App 和 AmS 是运行在2个独立的 Java虚拟机(),App申请内存不会通知AmS,AmS也无法感知App申请内存。
Java虚拟机运行时,每一个 App都有各自独立的内存空间。各自独立,进程互斥。
由于 Android 底层的 Linux 的内存机制不是使用 磁盘虚拟内存,所以 RAM=实际的物理内存。
为了在 RAM 中容纳所需的一切,Android 会尝试跨进程共享 RAM 页面。
回收的系统的“”潜规则
OOM Killer
在Android中运行了一个OOM 进程,即Out Of Memory。
该进程启动时会首先向Linux内核中把自己注册为一个OOM Killer,即当Linux内核的内存管理模块检测到系统内存低的时候就会通知已经注册的OOM进程,然后这些OOM Killer就可以根据各种规则进行内存释放了,当然也可以什么都不做。
Android中的OOM Killer进程是仅仅适用于Android应用程序的,该进程在运行时,AmS需要把每一个应用程序的oom_adj值告知给Killer。这个值的范围在-16到15,值越低,说明越重要,这个值类似于Linux系统中的进程nice值,只是在标准的Linux中,有其自己的一套Killer机制。
总结:当发生低内存的条件时,Linux内核管理模块通知OOM Killer,Killer则根据AmS所告知的优先级,强制退出优先级低的应用进程