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