Android线程优先级和进程oom_adj

2020-10-09  本文已影响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掉了

上一篇 下一篇

猜你喜欢

热点阅读