Android 操作系统的内存回收机制

APP 的运行环境
是一款基于 Linux 内核,面向移动终端的操作系统 。为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使得其进程调度与资源管理与其他平台的 Linux 有明显的区别 。主要包含下面几个层次:
将整个操作系统分隔成两个部分 。对应用开发者而言,所有 APP 都是运行在之上,而并不需要关心系统底层的情况 。层为应用开发者提供了丰富的应用编程接口,如,,,以及各种窗口资源等 。在层,是一个 APP 最基本的组成部分 。一般每个对应于屏幕上的一个视图(或者说一屏),一个 APP 可以有一个或者多个。应用程序被打包成 .apk 格式的文件,由VM 解释执行 。
VM
虚拟机采用寄存器架构,而不是 JVM 的栈结构 。Java 程序编译后的 .class 文件并不能在中解释执行 。因此提供了一个 dx 工具,用于将 .class 文件转换成能够识别的 .dex 格式 。具体VM 的细节不是本文重点,以下不再讨论 。
Linux
由上所述,所有的 APP 都是由 Java 代码编写并在VM 中得到解释执行 。在操作系统中,每个VM 的每个都对应于 Linux 内核中的一个进程 。可以使用 adb shell 工具查看系统中的当前进程 。如下图所示,.3.3 启动后内核中的进程列表 。
UID 标识为的每一项都是一个 app 所占用的进程,可见设计使得每个应用程序由一个独立的实例解释执行,而每个 Linux 内核进程加载一个实例,通过这种方式提供 app 的运行环境 。如此,每个 APP 的资源被完全屏蔽,互不干扰 。虽然同时引入了进程间通信的困难,但也带来了更强的安全性 。
内存回收原则
下面将从和 Linux两个层次分析操作系统的资源管理机制 。
之所以采用特殊的资源管理机制,原因在于其设计之初就是面向移动终端,所有可用的内存仅限于系统 RAM,必须针对这种限制设计相应的优化方案 。当应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭” 。从而使得用户调用程序时能够在第一时间得到响应 。当系统内存不足时,系统将激活内存回收过程 。为了不因内存回收影响用户体验(如杀死当前的活动进程),基于进程中运行的组件及其状态规定了默认的五个回收优先级:
IMPORTANCE_FOREGROUND:IMPORTANCE_VISIBLE:IMPORTANCE_SERVICE:IMPORTANCE_BACKGROUND:IMPORTANCE_EMPTY:

Android 操作系统的内存回收机制

文章插图
这几种优先级的回收顺序是 Empty 、 、 、 、。关于划分原则参见 文件中 。
ce 集中管理所有进程的内存资源分配 。所有进程需要申请或释放内存之前必须调用 ce 对象,获得其“许可”之后才能进行下一步操作,或者 ce 将直接“代劳” 。类 ce 中涉及到内存回收的几个重要的成员方法如下:(),(),()。这几个成员方法主要负责默认的内存回收机制,若 Linux 内核中的内存回收机制没有被禁用,则跳过默认回收 。
默认回收过程
操作系统中的内存回收可分为两个层次,即默认内存回收与内核级内存回收,本章重点对默认内存回收机制进行研究,Linux 内核层次的内存回收机制将在下一张介绍 。本章所有代码可参见 ce.java 。
回收动作入口:()
系统中内存回收的触发点大致可分为三种情况 。第一,用户程序调用 (), 使当前活动的被覆盖;第二,用户按 back 键,退出当前应用程序;第三,启动一个新的应用程序 。这些能够触发内存回收的事件最终调用的函数接口就是 () 。当 ce 接收到异步消息或者时,() 将会被调用 。代码如下: