现在的位置: 首页 > 综合 > 正文

Android 系统如何Kill进程当系统内存不足【原理】

2017年12月15日 ⁄ 综合 ⁄ 共 1774字 ⁄ 字号 评论关闭
文章目录

前言

        大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可以正常的运行,而不会崩溃,今天,就具体讲讲这个原理。

进程优先级(importance hierarchy)

        Android系统尽量保持进程运行的更久,但是仍有时候,需要结束掉老的进程,回收内存来保证新的,或更重要的进程运行。要决定哪些进程运行,哪些被KILL,系统会为每个运行的进程或者组件设置其进程优先级。通常KILL的顺序是优先级最低,然后其次,等等依次这样下去。

        一共有五级:

        前台进程(Foreground Process)

        满足以下条件即为前台进程:

        a. 用户当前正在操作的Activity(Activity.onResume方法已经被调用了);

        b. Service绑定到用户当前正在操作的Activity;

        c. Service在前台运行(Service.startForeground);

        d. Service正在执行生命周期中的方法之一(onCreate, onStart, onDestroy);

        e. BroadcastReceiver正在执行onReceive方法;

        通常,前台进程是很少的(就以上几种),所以它们是最后被KILL的(内存极少,系统为了能保证正常运行,且能与用户交互,当前台进程不止一个时,会KILL某些前台进程)。不过,这情况,对于目前的手机来说,不太可能发生的事。

        可见进程(Visible process)

        满足以下条件即为可见进程:

        a. Activity不为前台进程,但生命周期处于onPause状态,也就是说,一个Dialog挡住了部分Activity;

        b. 和1.b中一样,Service绑定在当前可见或前台Activity;

        可见进程同样也很重要,当系统内存不足,且为了保证前台进程继续运行时,可见进程会被KILL掉。

         服务进程(Service process)

        通常都是被startService方法调用而运行的Service,而没有绑定到其它Activity上(即1.b, 2.b中所说的情况),这些Service可能是在后台下载,或是类似音乐播放器一样等服务,同样,为了保证前台和可见进程能够正常运行,系统会KILL掉服务进程。

         后台进程(Background process)

        这些进程通常都是Activity完全不可见,即生命周期处于onStop阶段时,只要不影响到用户的操作,那么,就可以随时被系统KILL掉用来保证前台,可见或是服务进程的运行。通常,有很多后台进程在运行,系统会将它们放入到LRU(Last Recent Used,最近使用)列表中,用来决定:最近使用过的最后被KILL,而很长时间没使用过的,将会被第一个KILL掉。

         空进程(Empty process)

        这类进程没有任何活动应用,之所有会有这样的进程,是为了缓存的目的。为了加快某个组件下次启动的时间而设计的。系统经常KILL这些进程用来平衡整个系统资源(通常是在进程缓存和内核缓存之间做平衡)。

        总结:

        i) 系统会根据进程的不同状态,会动态调整进程的优先级,比如:用户当前与某个Activity交互,然后按了一下HOME键,则进程从前台进程切换至后台进程,并被加入到LRU列表中;

        ii) 进程所处不同的优先级,将会决定当系统内存不足时,其命运将会如何,进程被KILL的顺序上面已经说的很清楚了,我这里再罗列下(空进程不考虑):

        — 后台进程 -> 服务进程 -> 可见进程 -> 前台进程;

        后台进程又以LRU来决定:

        — LRU中找到最长时间没用过的先被KILL,然后找到其次最长时间没用过的被KILL,依次类推,而最近被使用过的最后KILL。

总结

        本篇初衷是想让我自己,以及大家,都有个更清楚的认识,了解其真正的原理,若有说错,还请指出,谢谢!

抱歉!评论已关闭.