从updateOomAdjLocked想到的

280 阅读1分钟

背景介绍

在Android中每个进程都存在优先级,优先级决定了内存紧张时,谁会被LMK杀死,谁会更多的得到CPU的调度。Android系统会根据每个进程内部的各个组件的运行状态来计算并设置对应的oomadj值。

相关代码分析

进程的优先级判定在AMS的updateOomAdjLocked方法中完成。关于updateOomAdjLocked有多个不同形参的方法,下面分别讲述下。

/**
 * Update OomAdj for a specific process.一般在某个具体的进程内组件(Activity service provider broadcast)的运行状态发生变化时。
 * @param app The process to update
 * @param oomAdjAll If it's ok to call updateOomAdjLocked() for all running apps
 *                  if necessary, or skip.
 * @return whether updateOomAdjLocked(app) was successful.
 */
@GuardedBy("this")
final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) {
    final ActivityRecord TOP_ACT = resumedAppLocked();
    final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;
    final boolean wasCached = app.cached;

    mAdjSeq++;

    // This is the desired cached adjusment we want to tell it to use.
    // If our app is currently cached, we know it, and that is it.  Otherwise,
    // we don't know it yet, and it needs to now be cached we will then
    // need to do a complete oom adj.
    final int cachedAdj = app.curRawAdj >= ProcessList.CACHED_APP_MIN_ADJ
            ? app.curRawAdj : ProcessList.UNKNOWN_ADJ;
    // 该方法的唯一调用处
    boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
            SystemClock.uptimeMillis());
    // 判断是否需要对全部进程进行一次updateOomAdj
    if (oomAdjAll
            && (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ)) {
        // Changed to/from cached state, so apps after it in the LRU
        // list may also be changed.
        updateOomAdjLocked();
    }
    return success;
}

// 对系统全部进程进行一次整体的updateOomAdj,该方法的调用场景一般在进程新创建或者进程退出时
final void updateOomAdjLocked() {

}

// 计算并设置具体进程的oomadj
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());
}

变更某个具体进程oomadj的流程图

zez481.png

进程退出时,整体刷新OomAdj流程图

image.png