标签: Low_Memory_Killer 低内存管理机制 系统内存管理
Low Memory Killer
Android 系统中运行的APP退出到后台时并不会真正杀死这个进程,而是将其缓存起来,以便下次能快速启用(热启动)。在系统内存不足情况下,系统会依据Low Memory Killer机制来杀死进程;
Low Memory Killer 基本原理
所有进程都是从zygote孵化出来的,记录在AMS中mLruProcesses列表中,由AMS统一管理,AMS中会根据进程的状态更新进程对应的oom_adj值,这个值会通过文件传递到kernel中,kernel有个低内存回收机制,在内存达到一定的阀值时会触发清理oom_adj值高的进程腾出更多内存空间
##Low Memory Killer 实现方案
先看android手机中的俩个文件
/sys/module/lowmemorykiller/parameters/minfree //文件中每一个数字代表一个内存级别
bullhead:/ # cat /sys/module/lowmemorykiller/parameters/minfree //文件中每一个数字代表一个内存级别
18432,23040,27648,32256,55296,80640
cat /sys/module/lowmemorykiller/parameters/adj //文件中每一个数字代表一个进程优先级级别
bullhead:/ # cat /sys/module/lowmemorykiller/parameters/adj //文件中每一个数字代表一个进程优先级级别
0,100,200,300,900,906
当系统剩余内存低于80640的时候,系统会杀死adj>=906级别的进程
当系统剩余内存低于55296的时候,系统会杀死adj>=900级别的进程
当系统剩余内存低于32256的时候,系统会杀死adj>=300级别的进程
当系统剩余内存低于27648的时候,系统会杀死adj>=200级别的进程
当系统剩余内存低于23040的时候,系统会杀死adj>=100级别的进程
对于应用进程来说,应用进程自身也有adj,应用进程自身adj由AMS负责更新;
ADJ 调整算法
ActivityManagerService 中三个核心方法:
updateOomAdjLocked:更新adj,当目标进程为空,或者被杀则返回false;否则返回true;
computeOomAdjLocked:计算adj,返回计算后RawAdj值;
applyOomAdjLocked:应用adj,当需要杀掉目标进程则返回false;否则返回true。
private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
ProcessRecord TOP_APP, boolean doingAll, long now) {
if (app.thread == null) {
return false;
}
computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now);
return applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime());
}
ADJ更新的地方
即调用updateOomAdjLocked方法的地方
Activity
- ActivityStackSupervisor.realStartActivityLocked() //启动Activity
- ActivityStack.resumeTopActivityInnerLocked //恢复栈顶Activity
- ActivityStack.finishSubActivityLocked //finish掉上一个Activity
- ActivityStack.finishVoiceTask //
- ActivityStack.finishCurrentActivityLocked //结束当前Activity
- ActivityStack.destroyActivityLocked //摧毁当前Activity
Service
- ActiveServices.bindServiceLocked //绑定服务(只更新当前app)
- ActiveServices.unbindServiceLocked //解绑服务 (只更新当前app)
- ActiveServices.realStartServiceLocked //启动服务
- ActiveServices.sendServiceArgsLocked //在bringup或则cleanup服务过程调用(只更新当前app)
- ActiveServices.bringDownServiceLocked //结束服务 (只更新当前app)
- ActiveServices.removeConnectionLocked //清除掉此进程的所有服务连接
- ActiveServices.serviceDoneExecutingLocked //进程服务出现异常(ANR或其他异常),移除timeout消息
广播
- BroadcastQueue.processCurBroadcastLocked //处理当前广播
- BroadcastQueue.deliverToRegisteredReceiverLocked //分发已注册的广播 (只更新当前app)
- BroadcastQueue.processNextBroadcast //处理下一个广播
Process
- ActivityManagerService.setSystemProcess //创建并设置系统进程
- ActivityManagerService.appDiedLocked //进程死亡
- ActivityManagerService.killAllBackgroundProcesses //杀死所有后台进程.即(ADJ>900或removed=true的普通进程)
- ActivityManagerService.killPackageProcessesLocked //以包名的形式 杀掉相关进程;
- ActivityManagerService.attachApplicationLocked //进程创建后attach到system_server的过程;
- ActivityManagerService.importanceTokenDied // 重要进程死亡
- ActivityManagerService.setProcessImportant//例如Toast弹出过程,设置进程优先级
- ActivityManagerService.getContentProviderImpl //获取provider (只更新当前app)
- ActivityManagerService.removeContentProvider // 移除provider
- ActivityManagerService.publishContentProviders //发布provider (只更新当前app)
- ActivityManagerService.removeContentProviderExternalUnchecked
- ActivityManagerService.publishContentProviders //发布provider (只更新当前app)
- ActivityManagerService.addAppLocked // 创建persistent进程
- ActivityManagerService.updateSleepIfNeededLocked //进程休眠相关
- ActivityManagerService.setHasTopUi //
- ActivityManagerService.bindBackupAgent //
- ActivityManagerService.unbindBackupAgent //
- ActivityManagerService.updateProcessForegroundLocked //将app从前台进程移除
- ActivityManagerService.setAppIdTempWhitelistStateLocked //
- ActivityManagerService.setUidTempWhitelistStateLocked //
- ActivityManagerService.trimApplications //清除没有使用app
- ActivityManagerService.setHasOverlayUi //
以上就是Low Memory Killer 调用地方和算法框架;下篇文章讲解Low Memory Killer如何将ADJ参数传递到底层kernel,kernel如何进行内存回收