Low Memory Killer(一)- android源码分析

标签: 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如何进行内存回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值