内存不足时Android 系统如何Kill进程
大家其实都或多或少知道,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。
内存不足时Android 系统如何Kill进程的更多相关文章
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...
- 【起航计划 037】2015 起航计划 Android APIDemo的魔鬼步伐 36 App->Service->Remote Service Binding AIDL实现不同进程间调用服务接口 kill 进程
本例和下个例子Remote Service Controller 涉及到的文件有RemoteService.java ,IRemoteService.aidl, IRemoteServiceCallb ...
- Android系统开机启动流程及init进程浅析
Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...
- 线程、进程概念与Android系统组件的关系
Android系统是Google公司基于Linux内核开发的开源手机操作系统.通过利用 Linux 内核的优势,Android 系统使用了大量操作系统服务,包括进程管理.内存管理.网络堆栈.驱动程序. ...
- Android 系统开发学习杂记(转)
http://blog.csdn.net/shagoo/article/details/6709430 > 开发环境1.安装 Eclipse 和 android-sdk 并解压安装2.Eclip ...
- Android系统机制
Android系统机制 本文主要介绍Android系统整体运行机制 Linux中的一些概念 uboot加载系统内核到内存,系统内核运行起来的后,会创建第一个用户进程叫init进程,该进程是所有用户进程 ...
- Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...
- Android系统编程入门系列之加载服务Service
之前几篇文章简单梳理了在Android系统的四大组件之一,最主要的界面Activity中,使应用程序与用户进行交互响应的相关知识点,那对于应用程序中不需要与用户交互的逻辑,又要用到哪些内容呢?本文开始 ...
- Android系统编程入门系列之服务Service中的进程间通信
在上篇文章以线程间的通信方式Handler类结尾,服务Service还支持的进程间通信,又是具体怎么实现的呢?这就要用到加载服务一文中提到的AIDL语言规范了. AIDL是 Android Inter ...
随机推荐
- cocos2d-x实战 C++卷 学习笔记--第7章 动作、特效(一)
前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action. ...
- WPF设置窗口模式(Windowstyle=“None”)
当WindowStyle="None"时,设置AllowsTransparency="True",则不会出现黑色Border,然后可以另外设置外边的Border ...
- Mac或Linux中对Android抓包
转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/mac-or-linux-android-caught/ 说明 首先要到http://www.charlesp ...
- css3的3D翻牌效果
利用hover控制动画,一个从翻面向正面翻,一个从正面向反面翻. 利用:backface-visibility: hidden;控制反面的元素不显示. 不支持的浏览器直接切换层级换图. <!DO ...
- IT书籍下载汇总--持续更新
本书单由北北分享,并持续更新,请将该地址加入收藏夹:北北的书单 .badge{float:right;}.list-group-item > .badge + .badge{margin-rig ...
- HTTP协议(4)
HTTP 概括总结 方便以后使用.遗忘时有侧重点的去学习,方便查阅: 开始看到webservice 和restful 有些不理解 现在可以简单理解为 : webservice = http协议+XM ...
- java根据url获取json对象
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...
- OpenSessionInViewFilter与org.springframework.dao.InvalidDataAccessApiUsageException
报错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r ...
- NodeJS+Express+Socket.io的一个简单例子
关键字:NodeJS,Express,Socket.io. OS:Windows 8.1 with update pro. 1.安装NodeJS:http://nodejs.org/. 2.初始化一个 ...
- 【JPA】两种不同的实现jpa的配置方法
两种不同的实现jpa的配置方法 第一种: com.mchange.v2.c3p0.ComboPooledDataSource datasource.connection.driver_class=co ...