本文转载:http://www.cnblogs.com/wytiger/p/5744752.html
熟悉Android所有系统的童鞋都知道,系统是出于验和性能考虑,app在退到后台时系统并不会真正的kill减少这个过程,但缓存它。打开的应用越多,后台缓存的过程就越多。当系统内存不足时,系统开始根据自己的过程回收机制来判断kill为了腾出内存供应所需的过程,需要消除哪些过程?app, 杀戮过程中回收内存的机制称为,它是基于Linux内核的机制诞生了。(更多关于。Low Memory Killer:Android Low Memory Killer)
了解完 Low Memory Killer,再科普一下。什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj您只需记住以下几点:
- 普通app进程的oom_adj>=0.系统过程oom_adj才可能<0
那么我们如何检查过程呢?oom_adj值需要以下两个shell命令
ps | grep PackageName///获取您指定的流程信息
这是我写的demo以代码为例,红色圈的中部分别是以下三个过程ID
UI进程:普通后台流程:灰色保活过程:
当然,这些过程id也可以通过AndroidStudio获得
接着我们来再来获取三个进程的oom_adj
cat/proc/进程ID/oom_adj
从上图可以看出到这里估计你也能明白,为什么普通的后台进程容易被回收,而前台进程则不容易被回收了吧。但明白这个还不够,接着看下图
上面是我把app切换到后台,再次进行oom_adj你会发现的UI从0到6, 灰色保存Service从0到1的过程。这里可以观察到,。
从Android在官方文件中,我们还可以看到优先级从高到低列出了这些不同类型的过程:、、、、。而这些过程oom_adj它们是多少?它们是如何联系在一起的?建议您阅读本文:Android Low Memory Killer
总结
写了这么多,最后做了一个小总结。回到开头提到QQ我曾经认为过这样技术存在于过程不死的问题上。不幸的是,我把手机拿走了root后,杀掉QQ过程后再也起不来了。一些手机制造商把这些知名的app放入自己的白名单,保证过程不会死,改善用户体验(如微信,QQ、莫莫都在小米的白名单上)。如果从白名单中删除,毕竟还是和普通人在一起。app为了尽量避免被杀,还是老老实实做好优化工作吧。
补充更新 (2016-04-20)
有童鞋问,在华为机上发现微信和手QUI过程退回后台,oom_adj值一点也没变,里面有黑科技吗?为此,我稍微验证了一下,验证方法是demo工程包名改为手机QQ是的,编译在华为的机器上运行,发现我的过程不会死,退到后台oom_adj值也没有变化,但恢复原包名是不够的。所以,你知道,手Q在华为机器上中。
文章到此结束。请参阅相关简单的实践代码
https://github.com/D-clock/AndroidDaemonService
附:
Android Low Memory Killer
关于 Android 过程保存,你需要知道的一切