Android调整进程的oom_adj

Android中的Low Memory Killer

LinuxKernel中的OOM Killer,内核所管理的进程都有一个衡量其oom权重的值,存储在/proc/<PID>/oom_adj中。根据这一权重值以及各种因素,系统会实时给每个进程评分,以决定OOM时应该杀死哪些进程。比如oom_score分数越低的进程,被杀死的概率越小,或者说被杀死的时间越晚。

Android系统也为此开发了一个专门的驱动,名为Low Memory Killer(LMK)

源码:drivers/staging/android/Lowmemorykiller.c

Lowmemorykiller.c中定义了内存容量处于某层级时需要被处理的adj值,这个adj的取值范围是-17 ~ 15,数字越小表示进程级别越高

在LMK执行清理工作时,它需要知道当钱系统中所有进程的adj归属情况,也即系统如何给进程评定adj等级。

Android进程所属ADJ值

ADJ描述

HIDDEN_APP_MAX_AD=15 

HIDDEN_APP_MIN_ADJ=9

当前只运行了不可见的Activity组件的进程
SERVICE_B_ADJ=8B list of service,和A list相比,它们对用户的粘合度要小一些
PREVIOUS_APP_ADJ=7用户前一次交互的进程。按照用户的使用习惯,我们经常会在几个常用进程间切换,所以这类进程得到再次运行的概率比较大
HOME_APP_ADJ=6Launcher进程,它对用户的重要性不言而喻
SERVICE_ADJ=5

当前运行了application service的进

BACKUP_APP_ADJ=4用于承载backup相关操作的进程
HEAVY_WEIGHT_APP_ADJ=3重量级应用程序进程
PERCEPTIBLE_APP_ADJ=2这类进程能被用户感觉到但不可见,如后台运行的音乐播放器
VISIBLE_APP_ADJ=1有前台可见的Activity的进程,如果轻易杀死这类进程将严重影响用户的体验
FOREGROUND_APP_ADJ=0当前正在前台运行的进程,也就是用户正在交互的那个进程
PERSISTENT_PROC_ADJ=-12Persistent性质的进程,如telephony
SYSTEM_ADJ=-16系统进程

 

方法一:写文件

进程的oom_adj可以通过写文件的形式来修改,路径为/proc/<PID>/oom_adj,比如init.rc中就有如下语句:

on early-init
    write /proc/1/oom_adj-16

PID值为1的进程是init进程,这里将此进程的adj改为-16,以保证它不会被杀死。

方法二:android:persistent

对于某些非常重要的应用程序,我们不希望它们被系统杀死,一个最简单的方法就是在它的AndroidManifest.xml文件中给“application”标签添加“android:persistent=true”属性。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值