内存不足时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。
转载于:https://www.cnblogs.com/gao-chun/p/4848584.html
内存不足时Android 系统如何Kill进程相关推荐
- Android系统中的进程管理:内存的回收
本文是Android系统进程管理的第三篇文章.进程管理的前面两篇文章,请参见这里: Android系统中的进程管理:进程的创建 Android系统中的进程管理:进程的优先级 本文适合Android平台 ...
- Android系统中的进程管理:进程的创建
对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...
- Android系统中的进程管理:进程的优先级
本文是Android进程管理系列文章的第二篇,会讲解进程管理中的优先级管理. 进程管理的第一篇文章:<进程的创建>请跳转至这里. 本文适合Android平台的应用程序开发者,也适合对于An ...
- Android系统在新进程中启动自定义服务过程(startService)的原理分析 (下)
Step 10. ActivityManagerService.attachApplicationLocked 这个函数定义在frameworks/base/services/java/com/and ...
- 根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...
导读:本文大约2000字,预计阅读时间3分钟.本文纯属技术文,无推广. 正文 首先应用进程的生命周期并不由应用本身直接控制,而是由系统综合多种因素来确定的.Android系统有自己的一套标准, ...
- 获取android com包名,Android系统中获取进程(和顶端包名)
概要: android L前我们可以使用 getRunningTasks(int maxNum) maxNum int: The maxNumnumber of entries to return i ...
- android版本内存多少,内存大小决定Android系统版本?
随着Android系统版本的更新(从Android 1.x-4.x),Android手机的内存容量也在不断的翻番中.从最早的256MB到最新的3GB,12倍的数值变化在彰显科技的进步之余,也潜移默化地 ...
- antimalware service executable占用内存过高_Win10系统svchost.exe进程占用内存和网速过高的解决方法...
我们在使用Windows10系统的过程中,不少用户一旦发现电脑异常,例如异常卡顿,就会查看一下任务管理器,是否有进程过高占用了CPU.内存.网络等,而在任务管理器中发现了一个名称为"svch ...
- android 内存占用工具,Android系统检测程序内存占用各种方法
1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal: 840868 kB MemFree: 457 ...
- Android系统级开发进程清理功能的一些记录和发现(一)
Android系统级开发清理功能的一些记录和发现 客户需求做一键清理所有后台进程的功能,在查阅网上相关博客以及自己研究以后找到以下几种方法: killBackgroundProcesses() 这种方 ...
最新文章
- 微信小程序将页面按钮悬浮固定在底部
- C++与Java多态的区别
- 入职地府后我成了人生赢家_拿年终奖前跳槽,你才是赢家
- (转)用Javascript获取页面元素的位置
- 期末前端web大作业——用前端语言写一个小游戏
- 数据库实验报告1数据库定义实验
- Windows 11彻底禁用IE浏览器后,银行网银系统完全解决方案!
- 在腾讯轻量云上搭建 CS:GO 服务器
- 阿里云天池机器学习训练营(Day7, Day8):机器学习算法(三):K近邻(k-nearest neighbors)初探
- PSD文件生成Unity预设
- 2014年双11抢货宝典-双11促销商品价格对比清单---妈妈再也不用担心我成为剁手党啦
- 《别告诉我你懂PPT》札记
- 考一个华为认证HCIP需要学习那些东西?
- easyUI —— JS加载easyUI表格
- 计算机cct 考试试题,基础计算机cct考试模拟试题.doc
- 笔记本一直提示计算机内存不足怎么办,笔记本电脑内存不足怎么办 解决方法...
- 电脑用着用着突然黑屏怎么处理
- 【TWVRP】基于matlab蚁群算法求解带时间窗车辆路径规划问题【含Matlab源码 1930期】
- 主管护师计算机考试如何舞弊,人机对话操作步骤详解,2020主管护师考生必看!...
- 容器运行过程中异常处理
热门文章
- Python密码存储器
- python爬虫之------每天给她(他)一个小故事啦啦啦啦
- 数组中的奇数排在偶数组前面
- datagrivew删除列_c# 如何获取datagrivew 表里面名称为card_id的一列,并把这列里面的元素循环...
- 题目:将一个正整数分解质因数
- Kubernetes部署项目报错ImagePullBackOff日志提示rpc error: code..http: server gave HTTP response to HTTPS client
- php字符串里含有全角符号,php半角转全角字符函数
- 垃圾代码和优质代码的区别?
- OpenGL ES总结(五)OpenGL 中pipeline机制
- 幅频响应 matlab画法,MATLAB环境下频率响应曲线的绘制方法.pdf