精华内容
下载资源
问答
  • 一、oom_adj 值对应的进程优先级、 二、oom_adj 值动态改变、 1、正常运行时的 oom_adj 值、 2、按下 Home 键后的 oom_adj 值、 3、按下回退键后的 oom_adj 值、 二、进程保活优化方向、





    一、oom_adj 值对应的进程优先级



    oom_adj 值对应的进程优先级 : 优先级从上到下越来越高 , 最下面的优先级最高 , 最上面的优先级最低 ;

    • UNKNOWN_ADJ = 16 : 缓存进程 ;
    • CACHED_APP_MAX_ADJ = 15 : 不可见进程的 oom_adj 最大值 ;
    • CACHED_APP_MIN_ADJ = 9 : 不可见进程的 oom_adj 最小值 ;
    • SERVICE_B_ADJ = 8 : 在 B 列表中的 Service 服务 , 这些服务比较老 , 再次使用的可能性较小 ;
    • PREVIOUS_APP_ADJ = 7 : 上一个应用程序进程 , 即上一次按下返回键退出的应用 , 缓存应用中的第一个应用 ;
    • HOME_APP_ADJ = 6 : Home 应用所在的进程 , 不能杀 ;
    • SERVICE_ADJ = 5 : 服务进程 ;
    • HEAVY_WEIGHT_APP_ADJ = 4 : 后台的重量级继承 , 启动时在 system/rootdir/init.rc 配置中设置 ;

    • BACKUP_APP_ADJ = 3 : 进入后台的进程 , 按下 Menu 键可查看 , 备份进程 , 可唤醒 ;
    • PERCEPTIBLE_APP_ADJ = 2 : 可感知进程 , 如后台播放音乐 , 铃声 , 震动 , 闪光灯 等除视觉外的其它可感知效果 ;
    • VISIBLE_APP_ADJ = 1 : 可见进程 ;
    • FOREGROUND_APP_ADJ = 0 : 前台进程 ;

    • PERSISTENT_SERVICE_ADJ = -11 : 系统或持久化进程绑定的进程 ;
    • PERSISTENT_PROC_ADJ = -12 : 系统持久化进程 , 如电话进程 ;
    • SYSTEM_ADJ = -16 : 系统进程 ;
    • NATIVE_ADJ = -17 : 本地进程 , 不受系统控制 ;

    打印出来的值是上述值 , 不是常量中定义的值 ;


    这些 ADJ 值都在 frameworks/base/services/core/java/com/android/server/am/ProcessList.java 源码中以常量形式记录 :

    /**
     * Activity manager code dealing with processes.
     */
    public final class ProcessList {
    
        // The B list of SERVICE_ADJ -- these are the old and decrepit
        // services that aren't as shiny and interesting as the ones in the A list.
        static final int SERVICE_B_ADJ = 800;
    
        // This is the process of the previous application that the user was in.
        // This process is kept above other things, because it is very common to
        // switch back to the previous app.  This is important both for recent
        // task switch (toggling between the two top recent apps) as well as normal
        // UI flow such as clicking on a URI in the e-mail app to view in the browser,
        // and then pressing back to return to e-mail.
        static final int PREVIOUS_APP_ADJ = 700;
    
        // This is a process holding the home application -- we want to try
        // avoiding killing it, even if it would normally be in the background,
        // because the user interacts with it so much.
        static final int HOME_APP_ADJ = 600;
    
        // This is a process holding an application service -- killing it will not
        // have much of an impact as far as the user is concerned.
        static final int SERVICE_ADJ = 500;
    
        // This is a process with a heavy-weight application.  It is in the
        // background, but we want to try to avoid killing it.  Value set in
        // system/rootdir/init.rc on startup.
        static final int HEAVY_WEIGHT_APP_ADJ = 400;
    
        // Adjustment used in certain places where we don't know it yet.
        // (Generally this is something that is going to be cached, but we
        // don't know the exact value in the cached range to assign yet.)
        static final int UNKNOWN_ADJ = 1001;
    
        // This is a process only hosting activities that are not visible,
        // so it can be killed without any disruption.
        static final int CACHED_APP_MAX_ADJ = 906;
        static final int CACHED_APP_MIN_ADJ = 900;
    
    
        // This is a process currently hosting a backup operation.  Killing it
        // is not entirely fatal but is generally a bad idea.
        static final int BACKUP_APP_ADJ = 300;
    
        // This is a process currently hosting a backup operation.  Killing it
        // is not entirely fatal but is generally a bad idea.
        static final int BACKUP_APP_ADJ = 300;
    
        // This is a process only hosting components that are perceptible to the
        // user, and we really want to avoid killing them, but they are not
        // immediately visible. An example is background music playback.
        static final int PERCEPTIBLE_APP_ADJ = 200;
    
        // This is a process only hosting activities that are visible to the
        // user, so we'd prefer they don't disappear.
        static final int VISIBLE_APP_ADJ = 100;
    
        // This is the process running the current foreground app.  We'd really
        // rather not kill it!
        static final int FOREGROUND_APP_ADJ = 0;
    
        // This is a process that the system or a persistent process has bound to,
        // and indicated it is important.
        static final int PERSISTENT_SERVICE_ADJ = -700;
    
        // This is a system persistent process, such as telephony.  Definitely
        // don't want to kill it, but doing so is not completely fatal.
        static final int PERSISTENT_PROC_ADJ = -800;
    
        // The system process runs at the default adjustment.
        static final int SYSTEM_ADJ = -900;
    
        // Special code for native processes that are not being managed by the system (so
        // don't have an oom adj assigned by the system).
        static final int NATIVE_ADJ = -1000;
    
        // Memory pages are 4K.
        static final int PAGE_SIZE = 4*1024;
    
    }
    

    参考源码 : frameworks/base/services/core/java/com/android/server/am/ProcessList.java





    二、oom_adj 值动态改变





    1、正常运行时的 oom_adj 值


    一个程序的 oom_adj 值是不断动态改变的 , 当程序处于前台时 , 该前台进程的 oom_adj 的值为 0 ,

    运行程序 ,

    在这里插入图片描述

    在 Android Studio 中 , 可以看到该运行的程序的进程号 PID 为 30856 30856 30856 ,
    在这里插入图片描述

    进入 adb shell 命令行 , su 获取 root 权限 , 使用如下命令 , 查询指定 PID 的 oom_adj 值 ;

    cat /proc/30856/oom_adj
    

    在这里插入图片描述




    2、按下 Home 键后的 oom_adj 值


    点击 Home 键 , 程序退出 , 显示 Home 程序 ,

    在这里插入图片描述

    此时查询该 PID 为 30856 30856 30856 的 oom_adj 值为 12 12 12 , 不可见进程范围是 9 9 9 ~ 15 15 15 , 此时的状态是不可见状态 ;

    在这里插入图片描述




    3、按下回退键后的 oom_adj 值


    在这里插入图片描述

    如果是按下回退键退出界面 , 此时查询该 PID 为 30856 30856 30856 的 oom_adj 值为 16 16 16 , 此时进程的状态是缓存进程 , 随时都可能被杀掉 ;

    在这里插入图片描述





    二、进程保活优化方向



    优先级越高 , oom_adj 值越小 , 越不能被杀死 ;

    如果想要使得进程尽可能长的保留在内存中 , 那么就要减小 oom_adj 的值 ;

    在 oom_adj 值相同时 , 内存占用量越大的进程 , 被杀的几率就越高 , 因此这里还要尽可能降低进程占用尽可能少的内存 ;

    总结一下就是 ① 降低 oom_adj 值 , ② 减小内存占用 ;

    展开全文
  • 一、oom_adj 值简介、 二、查询进程号 PID、 三、查询进程对应的 oom_adj





    一、oom_adj 值简介



    oom_adj 值是 Linux 内核为每个进程分配的 , 该值可以反映进程的优先级 ;

    在内存不足 , 要杀进程 , 回收内存时 , 会根据该 oom_adj 值决定是否回收该进程 ;

    oom_adj 值越大 , 对应的进程优先级越低 ;





    二、查询进程号 PID



    获取进程号 :

    执行如下命令 , 可以获取 Android 手机的进程号 ;

    adb shell ps
    

    PS 每行的输出含义 :

    • USER : 进程所属用户 , ROOT 是权限最高的用户 , 其它都是各个应用对应的用户名称 ;
    • PID : 进程 ID ;
    • PPID : 进程父 ID ;
    • VSZ : Virtual Size 缩写 , 进程虚拟内存大小 ;
    • RSS : Resident Set Size 缩写 , 该进程实际驻留在内存中的大小 ;
    • WCHAN : 休眠进程对应的在内核中的地址 ;
    • NAME : 进程名称 ;

    在这里插入图片描述

    在这里插入图片描述

    最后看到了熟悉的企鹅进程保活操作 , 有 3 3 3 个进程 ;


    在 Android Studio 界面中也可以查看进程 ID , 在 Logcat 面板中 , 进程栏中 , 可以看到 kim.hsl.app2 进程的进程 PID 是 11694 ;

    在这里插入图片描述

    在 PS 中对应的该 PID 为 11694 的进程 ;

    u0_a356      11694   725 3714484  75520 0                   0 S kim.hsl.app2
    

    在这里插入图片描述





    三、查询进程对应的 oom_adj 值



    获取进程号之后 , 执行如下命令 , 即可查询进程号对应进程的 oom_adj 值 ;


    首先进入 Android 设备 adb shell 命令行 ,

    adb shell
    

    然后获取 root 权限 ,

    su
    

    最后查询进程号对应进程的 oom_adj 值 ;

    cat /proc/11694/oom_adj
    

    最终查询的该进程的 oom_adj 值为 0 , 说明该进程当前处于前台 , 是前台进程 ;

    在这里插入图片描述


    查下企鹅的三个进程的 oom_adj 值 :

    u0_a295      12420   725 4532232  92244 0                   0 S com.tencent.mm:push
    u0_a296      12474   726 1202112  78148 0                   0 S com.tencent.mobileqq:TMAssistantDownloadSDKService
    u0_a296      12591   726 1231864  84668 0                   0 S com.tencent.mobileqq:MSF
    
    • com.tencent.mm:push : 0 , 前台进程 , 这操作比较骚了 , 哪来了前台进程啊 ~~~
    • com.tencent.mobileqq:TMAssistantDownloadSDKService : 这个进程还带重启的 , 查询的时候 , 进程号不见了 , 发现重启了 , 16 ;
    • com.tencent.mobileqq:MSF : 9 ;

    在这里插入图片描述

    展开全文
  • // The minimum time we allow between crashes, for us to consider this// application to be bad and stop and its services and reject broadcasts.static final int MIN_CRASH_INTERVAL = 60*...// OOM adjus...

    // The minimum time we allow between crashes, for us to consider this

    // application to be bad and stop and its services and reject broadcasts.

    static final int MIN_CRASH_INTERVAL = 60*1000;

    // OOM adjustments for processes in various states:

    // Adjustment used in certain places where we don’t know it yet.

    // (Generally this is something that is going to be cached, but we

    // don’t know the exact value in the cached range to assign yet.)

    // ZMS:用作对一些特定的我们未知的地方进行调整。

    //(通常是一些缓存,但是我们并不知道确切的缓存划分)

    static final int UNKNOWN_ADJ = 16;

    // This is a process only hosting activities that are not visible,

    // so it can be killed without any disruption.

    // ZMS:这个是一个仅仅拥有后台不可见Activity的进程,可以被无破坏杀掉。

    static final int CACHED_APP_MAX_ADJ = 15;

    static final int CACHED_APP_MIN_ADJ = 9;

    // The B list of SERVICE_ADJ – these are the old and decrepit

    // services that aren’t as shiny and interesting as the ones in the A list.

    // ZMS:B列表Service ADJ–B列表Service是一些老旧的Service,没有A列表里的Service新。

    static final int SERVICE_B_ADJ = 8;

    // This is the process of the previous application that the user was in.

    // This process is kept above other things, because it is very common to

    // switch back to the previous app. This is important both for recent

    // task switch (toggling between the two top recent apps) as well as normal

    // UI flow such as clicking on a URI in the e-mail app to view in the browser,

    // and then pressing back to return to e-mail.

    // ZMS:这是用户前一个使用应用的进程。此进程优先级之所以排到其他缓存进程之上,

    // 是因为切回前一个应用的场景很常见……

    static final int PREVIOUS_APP_ADJ = 7;

    // This is a process holding the home application – we want to try

    // avoiding killing it, even if it would normally be in the background,

    // because the user interacts with it so much.

    // ZMS:主界面进程–尽管它经常在后台,我们同样想避免杀掉它,毕竟用户和主界面交互很多。

    static final int HOME_APP_ADJ = 6;

    // This is a process holding an application service – killing it will not

    // have much of an impact as far as the user is concerned.

    // ZMS:服务进程–由于用户关切,杀掉它会有不小影响。

    static final int SERVICE_ADJ = 5;

    // This is a process with a heavy-weight application. It is in the

    // background, but we want to try to avoid killing it. Value set in

    // system/rootdir/init.rc on startup.

    // ZMS:重量级应用进程。它在后台,但是我们想避免杀掉它。

    static final int HEAVY_WEIGHT_APP_ADJ = 4;

    // This is a process currently hosting a backup operation. Killing it

    // is not entirely fatal but is generally a bad idea.

    // ZMS:执行备份操作的进程。杀掉它不完全致命,但通常是个坏想法。

    static final int BACKUP_APP_ADJ = 3;

    // This is a process only hosting components that are perceptible to the

    // user, and we really want to avoid killing them, but they are not

    // immediately visible. An example is background music playback.

    // ZMS:拥有用户可感知组件的进程,所以我们尽量要避免杀掉它,尽管它不是立即可见。

    // 例如:后台音乐播放。

    static final int PERCEPTIBLE_APP_ADJ = 2;

    // This is a process only hosting activities that are visible to the

    // user, so we’d prefer they don’t disappear.

    // ZMS:此进程仅仅拥有用户可见的Activity,所以我们不希望它消失。

    static final int VISIBLE_APP_ADJ = 1;

    // This is the process running the current foreground app. We’d really

    // rather not kill it!

    // ZMS:前台应用进程。最好不要杀掉它!

    static final int FOREGROUND_APP_ADJ = 0;

    // This is a system persistent process, such as telephony. Definitely

    // don’t want to kill it, but doing so is not completely fatal.

    // ZMS:系统常驻进程,比如电话。绝对不想要杀死它,但是即便杀死也不是很致命。

    static final int PERSISTENT_PROC_ADJ = -12;

    // The system process runs at the default adjustment.

    // ZMS:系统进程

    static final int SYSTEM_ADJ = -16;

    // Special code for native processes that are not being managed by the system (so

    // don’t have an oom adj assigned by the system).

    // ZMS:为native进程保留,他们不被系统管理。

    static final int NATIVE_ADJ = -17;

    修改指定包名应用的oom_adj,避免被系统回收:

    Android 4.4:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

    Android 5.1:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

    public final class ActivityManagerService extends ActivityManagerNative app.persistent = true;

    app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;

    }

    if("com.zms.test".equals(info.packageName)){

    app.persistent = true;

    app.maxAdj = ProcessList.SYSTEM_ADJ;

    }

    if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {

    mPersistentStartingProcesses.add(app);

    startProcessLocked(app, "added application", app.processName);

    展开全文
  • 动态调整某个应用的进程级别,防止系统因低内存被kill,可配合读取白名单列表(列表中是应用包名列表)使用,这里只是介绍思路。 ... //引用此包 ... ...2.找到方法private final boolean applyOomAdjLocked(ProcessRecord
  • Log.v(TAG, "getOomAdj ----------oomAdj = " + oomAdj); } int oomscore = Integer.parseInt(read(String.format( "/proc/%d/oom_score", pid))); Log.v(TAG, "getOomAdj ----------oomscore = ...
  • oom_adj :oom_adj(即权重值)的值用来标记进程的重要程度,值越小,越重要 1.查看当前在运行的进程 ps 命令 基于api 21 USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 2936 548 c02cb2ef 0806b8f0 ...
  • oom_adj

    千次阅读 2018-07-15 10:34:02
    oom_adj值越高则代表进程越不重要,在系统执行低杀操作时,会从oom_adj值越高的开始杀。系统lowmemeorykiller机制下对于进程的级别的以变量的形式定义在framework/base/core/java/...
  • 一、/proc/pid_num 进程号对应进程信息文件、 ...4、oom_adj 进程优先级、 5、maps 进程内存使用概况、 6、smaps 进程内存使用详情、 7、mem 进程内存映射、 8、task 子线程、 9、environ 环境变量、
  • OOM打分因子、oom_adj以及oom_score

    千次阅读 2020-01-29 14:56:18
    OOM就是out of memory的缩写,虽然linux kernel有很多的内存管理技巧(从cache中回收、swap out等)来满足各种应用空间的vm内存需求,但是,当你的系统配置不合理,让一匹小马拉大车的时候,linux kernel会运行非常...
  • 不要再使用oom_adj,应该使用新的oom_score_adj 作为oom killer的参数 /var/log/messages:Nov 13 21:31:52 -b kernel: [1455884.300891] ksh (2441): /proc/3500/oom_adj is deprecated, please use /proc/3500/oom_...
  • 进程保活之oom_adj级别查询

    千次阅读 2017-05-25 16:24:36
    当系统的内存不足时, Android系统将根据进程优先级选择杀死一些...如果oom_adj的值为 NATIVE_ADJ 即为-17,那么,程序为native级别永驻内存了。  1.获取当前连接的所有设备 在DOS下使用 adb devices命令 注意  上
  • Android进程优先级oom_adj

    千次阅读 2016-12-29 10:44:07
    当Android运行了很多进程后...命令行中输入cat /proc/process_id/oom_adj 可以查看到某一进程的adj数值,系统就是根据这一数值来判定进程是否被杀或者保留。ADJ等级定义在frameworks/base/services/core/java/com/andr
  • 查看手机进程oom_adj

    千次阅读 2017-11-22 19:22:55
    【1】adb shell 【2】ps 【3】cat /proc/进程id/oom_adj
  • 从 Android bindService Flag看oom_adj

    千次阅读 2017-03-29 00:51:48
    主要以一个简单的demo讨论在bindService时,client和Service分处不同的进程,bindService传入的Flag分别对client进程和service进程的oom_adj值有什么影响。 我写了两个应用,A应用(com.test.serviceadjdemo_client...
  • 当系统的内存不足时, Android系统将根据进程优先级选择杀死一些不太重要的进程。...对,就是这个根据进程的oom_adj值。oom_adj的值越小,进程的优先级越高。...如何查看某个应用的oom_adj数值
  • 一 : 前台进程 (Active Process): oom_adj为0。 前台进程包括 : 1 : 活动 正在前台接收用户输入 2:活动、服务与广播接收器正在执行一个onReceive事件的处理函数 3: ...
  • android OOM_adj 的设置流程

    千次阅读 2016-09-12 17:29:40
    流程如下: setOomAdj --> framework/base/core/jni/android_util_Process.cpp android_os_Process_setOomAdj...sprintf(text, "/proc/%d/oom_adj", pid); int fd = open(text, O_WRONLY); sprintf(text, "%d
  • 函数GetContainerOOMScoreAdjust,负责返回container里的进程的 oom_score_adj值;具体是根据pod 所属的服务级别:guaranteed, burstable,bestEffort。 Guaranteed级别的pod进程应该是最后被杀的(如果OOM 发生)...
  • 2./proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算(2ⁿ,n就是oom_adj的值)后的结果。 oom_adjoom_score是oom_killer的主要参考值     ...
  • OOMadj值的区分

    2021-05-11 16:21:43
    write/sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15 write/proc/sys/vm/overcommit_memory 1 write/sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144 进程oom_adj同样...
  • oom_adj分析

    千次阅读 2015-06-11 16:55:49
    oom_adj;done -17为OOM机制对此进程失效。结果后果很严重如下图 我所有连接上的ssh都被中断,想必原因是kill不了a20G这个程序,只能把其他的能杀的都杀了吧。 最后急急忙忙去机房重启机器,查看...
  • + static final int GN_CORE_SERVER_ADJ = -1; + // Gionee 2011-12-30 huyuke add for CR00XXXX end // The system process runs at the default adjustment. static final int SYSTEM_ADJ = -16; @@ -3640,6 +...
  • zygote oom_score_adj 被设置成1000

    千次阅读 2015-08-27 13:49:50
    mkd-275 [000] d..3 45647.298262: oom_score_adj_update: pid=22219 comm=ReferenceQueueD oom_score_adj=1000 lmkd-275 [000] d..3 45647.642019: oom_score_adj_update: pid=22219 comm=ReferenceQueueD oom

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,087
精华内容 2,834
关键字:

oom_adj

友情链接: GPRSWAP.rar