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

本文转载自:http://www.cnblogs.com/wytiger/p/5744752.html

 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app, 这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM Killer机制诞生。(更多关于Low Memory Killer请参考Android Low Memory Killer

  了解完 Low Memory Killer,再科普一下oom_adj。什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用,你只需要记住以下几点即可:

  • 进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收
  • 普通app进程的oom_adj>=0,系统进程的oom_adj才可能<0

那么我们如何查看进程的oom_adj值呢,需要用到下面的两个shell命令

ps | grep PackageName //获取你指定的进程信息

这里是以我写的demo代码为例子,红色圈中部分别为下面三个进程的ID

UI进程:com.clock.daemon
普通后台进程:com.clock.daemon:bg
灰色保活进程:com.clock.daemon:gray

当然,这些进程的id也可以通过AndroidStudio获得

接着我们来再来获取三个进程的oom_adj

cat /proc/进程ID/oom_adj

从上图可以看到UI进程和灰色保活Service进程的oom_adj=0,而普通后台进程oom_adj=15。到这里估计你也能明白,为什么普通的后台进程容易被回收,而前台进程则不容易被回收了吧。但明白这个还不够,接着看下图

上面是我把app切换到后台,再进行一次oom_adj的检验,你会发现UI进程的值从0变成了6, 而灰色保活的Service进程则从0变成了1。这里可以观察到,app退到后台时,其所有的进程优先级都会降低。但是UI进程是降低最为明显的,因为它占用的内存资源最多,系统内存不足的时候肯定优先杀这些占用内存高的进程来腾出资源。所以,为了尽量避免后台UI进程被杀,需要尽可能的释放一些不用的资源,尤其是图片、音视频之类的

从Android官方文档中,我们也能看到优先级从高到低列出了这些不同类型的进程:Foreground processVisible processService processBackground processEmpty process。而这些进程的oom_adj分别是多少,又是如何挂钩起来的呢?推荐大家阅读这篇文章: Android Low Memory Killer

总结

絮絮叨叨写完了这么多,最后来做个小小的总结。回归到开篇提到QQ进程不死的问题,我也曾认为存在这样一种技术。可惜我把手机root后,杀掉QQ进程之后就再也起不来了。有些手机厂商把这些知名的app放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通app一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。

所以,进程保活的根本方案终究还是回到了性能优化上,进程永生不死终究是个彻头彻尾的伪命题!

补充更新 (2016-04-20)

有童鞋问,在华为的机子上发现微信和手Q的UI进程退到后台,oom_adj的值一点都没有变,是不是有什么黑科技在其中。为此,我稍稍验证了一下,验证方式就是把demo工程的包名改成手机QQ的,编译运行在华为的机子上,发现我的进程怎么杀也都是不死的,退到后台oom_adj的值同样不发生变化,而恢复原来的包名就不行了。所以,你懂的,手Q就在华为机子的白名单中。

文章到此结束,相关简单的实践代码请看

https://github.com/D-clock/AndroidDaemonService

附:

Android Low Memory Killer

关于 Android 进程保活,你所需要知道的一切

Android后台保活实践总结:即时通讯应用无法根治的“顽疾”

时间: 2024-12-14 18:49:10

Android进程回收机制LMK(Low Memory Killer)【转】的相关文章

Android进程回收机制

熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app.这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM Killer(Out-Of-Memory killer)机制诞生. 了解完 Low Memory Kille

android里面的进程回收机制[转载]

http://blog.sina.com.cn/s/blog_40d475e901012jgt.html Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收.由此带来三个问题:l 回收规则: 什么时候回收与回收哪一个l 避免误杀: 如何阻止被回收l 数据恢复与保存: 被回收了怎么办 Android将进程分为6个等级,它们按优先级顺序由高到低依次是:1.前台进程( FOREGROUND_APP)2.可视进程(VISIBLE_APP )3. 次要服务进程(SEC

Android中的Low Memory Killer

转载请标明出处: http://blog.csdn.net/yujun411522/article/details/46334123 本文出自:[yujun411522的博客] 在现有的技术条件下,内存永远都是一个吃紧的资源,不用说是PC上会出现内存不足的可能,更不必说在移动设备上了.一旦出现内存不足就会导致系统卡顿,影响用户体验.而Android运行在Linux的基础之上,Linux的内存的使用原则就是不要浪费内存,所以在程序退出时在一段时间内还停留在内存中,这也是我们下一次打开程序时发现快一

low memory killer配置的思考

OOM_ADJ对于低内存的时候,我们总是想尽量杀掉background的app,尽量保留persist service(比如输入法),让前台app能够流畅的运行.1,background app的adj尽量设高一些,但是max和mini之前,尽量还是要保留一些差距,这样让系统可以逐步去kill进程,而不是一次杀掉很多.一次杀掉很多app很容易造成系统卡顿.2,previeous app和home launcer的adj一定要独立出来,并且不能设置太低,previous app可能会占用很多的内存

【朝花夕拾】Android性能篇之(六)Android进程管理机制

前言        Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.Android这样设计有什么优势呢?又是通过怎样的方法来管理这些被保留的进程的呢?Android用户又该如何正确使用手机从而更好发挥Android系统所特有的优势呢?本文将一一为您解开这些谜团.        一.Android进程管理的特殊设计 Linux系统对进程的管理方式是一旦进程活动停止,系统就

Android内存回收机制

退出但不关闭: 这是Android对于Linux的优化.当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”.从而使得用户调用程序时能够在第一时间得到响应. 应用切换到后台是暂停的,完全不耗cpu和电量,只保留了运行状态.如果app需要后台处理事务(放音乐),那么app进程会开启相应的服务,所以在后台有消耗的只有服务. 占用CPU的应用才耗电,后台的只占内存,所以是不耗电的.默认回收机制: 当系统内存不足时,系统将激活内存回收过程

【转】Android 内存回收机制(默认回收与kernel回收)

Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使得其进程调度与资源管理与其他平台的 Linux 有明显的区别.主要包含下面几个层次: Application Framework Application Framework 将整个操作系统分隔成两个部分.对应用开发者而言,所有 APP 都是运行在 Application Framework 之上,而并不需要关心系统底层的

Android 进程通信机制之 AIDL

什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在形式是一种 .aidl 文件,开发者需要做的就是在该文件中定义进程间通信的接口,编译的时候 IDE 就会根据我们的 .aidl 接口文件生成可供项目使用的 .java 文件,这和我们说的"语法糖"有些类似. AIDL 的语法就是 java 的语法,就是导包上有点细微差别.java 中如果两

Android进程回收的一些知识

关于OOM_ADJ说明: Android 进程易被杀死的情形: 参考:Android进程保活招式大全