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


清单 1.的处理方式
case IDLE_NOW_MSG:{ IBinder token = (Ibinder)msg.obj; activityIdle(token, null); } break;
清单 2.的处理方式
case IDLE_TIMEOUT_MSG: { if (mDidDexOpt) { mDidDexOpt = false; Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); nmsg.obj = msg.obj; mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); return; } IBinder token = (IBinder)msg.obj; Slog.w(TAG, "Activity idle timeout for " + token); activityIdleInternal(token, true, null); } break;
由的切换以及焦点的改变等事件引发,在启动超时的情况下引发,一般这个超时时间设为 10s,如果 10s 之内一个依然没有成功启动,那么将发送异步消息进行资源回收 。() 的主要任务是改变系统中的状态信息,并将其添加到不同状态列表中 。其主要工作如下:
首先,调用 () 方法通知所有进行中的任务进行垃圾回收 。() 将进行调度 JVM 的,回收一部分内存空间,这里仅仅是通知每个进程自行进程垃圾检查并调度回收时间,而非同步回收 。然后,取出和列表中的所有内容,暂存在临时变量中 。这两个列表分别存储了当前状态为 stop 和的对象 。对于 stop 列表,如果其中的的状态为 true,判断是不是要立即停止,如果要立即停止则调用 d() 通知目标进程调用 () 方法,否则,先调用 () 运行下一个。如果状态为 false,则调用 () 通知客户进程停止该,这种情况一般发生在调用 () 后 。对于列表,直接调用 d() 通知客户进程销毁目标。
这里的 d 等函数并没有真正意义上改变内存的使用,只是将其状态改变为“允许回收”,真正的回收在下面即将调用的 () 函数中 。
回收过程函数 ()

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

文章插图
() 函数的结构如下 :
清单 3.函数
private final void trimApplications() { synchronized (this) { // First remove any unused application processes whose package // has been removed. for (i=mRemovedProcesses.size()-1; i>=0; i--) { (1)//kill process; } if (!updateOomAdjLocked()) { (2)//do something default } // Finally, if there are too many activities now running, try to // finish as many as we can to get back down to the limit. (3)do something } }
清单 3 中的三个标序号的位置分别负责如下工作:
(1)当程序执行到 () 之后,首先检查列表中的进程 。列表中主要包含了 crash 的进程、5 秒内没有响应并被用户选在强制关闭的进程、以及应用开发这调用 s 想要杀死的进程 。调用 . 将所有此类进程全部杀死 。
(2)调用 () 函数,若成功返回,说明 Linux 内核支持 () 接口,将修改 adj 的值并通知 linux 内核,内核根据 adj 值以及内存使用情况动态管理进程资源( 和 ) 。若 () 返回为假,则表示当前系统不支持 () 接口,将在本地进行默认的资源回收 。
(3)最后,如果当前依然运行了过多的,对多余的进行回收 。() 的大多数的代码都在处理不存在情况下的默认资源回收,下面对其默认回收过程(即代码清单中标记(2)的位置)进行进一步分析 。其回收过程可大致描述如下 。
步骤一,获取当前所有运行的进程,中的排序规则是按最近使用时间 。对中不能被关闭的进程进行计数,这些不能被关闭的进程包括运行的进程,运行的进程等,见如下代码 。
清单 4. 计数不能被关闭的进程
if (app.persistent || app.services.size() != 0 || app.curReceiver != null || app.persistentActivities > 0) { // Don't count processes holding services against our // maximum process count. numServiceProcs++; }