资讯详情

Android进程回收机制LMK(Low Memory Killer)【转】

本文转载: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 过程保存,你需要知道的一切

Android后台保存实践总结:即时通讯应用无法治愈的顽疾

标签: lmk307液位传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台