美文网首页
Android线程优先级和进程oom_adj

Android线程优先级和进程oom_adj

作者: 过期的薯条 | 来源:发表于2020-10-09 23:47 被阅读0次

    1.引言

    在处理app启动速度的时候,可以设置主线程的优先级,保证主线程占用的cpu足够久。进程的oom_adj,决定了当内存不够的时候,lmk会根据oom_adj的大小依次释放内存。

    2.正题

    2.1线程的优先级

    android中对线程等级划分如下:

    常量 数值 解释
    THREAD_PRIORITY_DEFAULT   0   默认的线程优先级,值为0
    THREAD_PRIORITY_LOWEST   19   最低的线程级别,值为19
    THREAD_PRIORITY_BACKGROUND   10   后台线程建议设置这个优先级,值为10
    THREAD_PRIORITY_FOREGROUND   -2   用户正在交互的UI线程,代码中无法设置该优先级,系统会按照情况调整到该优先级,值为-2
    THREAD_PRIORITY_DISPLAY  -4   也是与UI交互相关的优先级界别,但是要比THREAD_PRIORITY_FOREGROUND优先,代码中无法设置,由系统按照情况调整,值为-4
    THREAD_PRIORITY_URGENT_DISPLAY -8 显示线程的最高级别,用来处理绘制画面和检索输入事件,代码中无法设置成该优先级,值为-8
    THREAD_PRIORITY_AUDIO -16 声音线程的标准级别,代码中无法设置为该优先级,值为 -16
    THREAD_PRIORITY_URGENT_AUDIO -19 声音线程的最高级别,优先程度较THREAD_PRIORITY_AUDIO要高。代码中无法设置为该优先级。值为-19
    THREAD_PRIORITY_MORE_FAVORABLE -1 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1
    THREAD_PRIORITY_LESS_FAVORABLE 1 THREAD_PRIORITY_LESS_FAVORABLE

    设置线程的优先级分为:android 提供的api和java sdk自带的api
    注意:要使用android提供的api设置,用java提供的作用不够显著

    new Thread () {
        @Override
        public void run() {
          super.run();
            android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
        }
    }.start();
    

    作用:可以在主线程设置主线层等级;在Glide加载图片的时候设置低优先级。当图片量很大的时候可以降低加载图片线程的等级

    2.2进程的优先级

    android内存不够了,会触发oom机制,lowMemoryKiller会根据每个进程的oom_adj的等级,依次杀死进程,释放内存。

    lom会根据free的内存的值,来判断kill掉哪个等级下的进程。例如当空闲内存只有64M了。会kill掉oom_adj 为12-15的进程

    adj级别 说明
    UNKNOWN_ADJ 16 预留的最低级别,一般对于缓存的进程才有可能设置成这个级别
    CACHED_APP_MAX_ADJ 15 缓存进程,空进程,在内存不足的情况下就会优先被kill
    CACHED_APP_MIN_ADJ 9 缓存进程,也就是空进程
    SERVICE_B_ADJ 8 不活跃的进程
    PREVIOUS_APP_ADJ 7 切换进程
    HOME_APP_ADJ 6 与Home交互的进程
    SERVICE_ADJ 5 有Service的进程
    HEAVY_WEIGHT_APP_ADJ 4 高权重进程
    BACKUP_APP_ADJ 3 正在备份的进程
    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 系统起的Native进程

    真实案例:应用A跳到第三方应用B,在第三方应用B中播放视频,加载大量图片,导致返回的时候,应用A走了SplashActivity。通过logcat发现A应用被kill掉了

    相关文章

      网友评论

          本文标题:Android线程优先级和进程oom_adj

          本文链接:https://www.haomeiwen.com/subject/olerpktx.html