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掉了
网友评论