Android进程管理:LRU weight机制的使用
借鉴自Android的设计与实现
LRU是最近最少使用的意思。
Android应用程序进程(包括建立了应用程序进程运行环境的system_server进程)启动后,都会在AMS的成员变量中保存其ProcessRecord信息。
保存ProcessRecord的方式有许多种,例如在mPidsSelfLocked和mProcessNames成员变量中,前者是PID为键,后者是进程名为键。
这种方式的存储顺序通常与应用程序组件的启动顺序相同,用于调度应用程序组件。
此外mLruProcesses以LRU顺序存储了当前运行的应用程序进程信息,mLruProcesses中的第一个元素就是最近最少使用的进程对应的ProcessRecord,用于管理应用程序进程。
3种情况可以更新mLruProcesses:
1.应用程序异常退出:调用handleAppDiedLocked更新mLruProcesses
2.显式“杀死”指定进程:调用AMS显式“杀死”进程时需要更新mLruProcesses
3.启动和调度应用程序4大组件:调用updateLruProcessLocked更新mLruProcesses
应用程序异常退出后,其进程也会被“杀死”。因此1、2情况都是从mLruProcesses列表中删除该进程信息。
更新入口
源码变化了很多,不贴了
updateLruProcessInternalLocked的主要工作
1.为指定的进程计算LRU序列号和LRU weight
2.根据lru weight值将指定进程信息插入mLruProcesses表示的进程LRU列表中,lru weight的值越大,在列表中的位置越靠后
3.如果进程使用了Content Provider或者Service,还需要更新Content Provider或者Service所在进程的lru weight及其在LRU列表中的位置
4.根据参数oomAdj的值决定是否同时调整OOM adj的值。
updateLruProcessInternalLocked方法调整的只是进程的lru weight和进程在LRU列表中的位置,并不会直接参与进程的管理,但是当其参数oomAdj的值为true时,便可以调用updateOomAdjLocked方法更新OOM adj信息,进而影响进程的管理。