`
chriszeng87
  • 浏览: 713922 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存不足时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。

 

转自:http://jingyan.baidu.com/article/656db918938764e381249ce5.html

分享到:
评论

相关推荐

    Android如何保证自己的服务被系统kill后又被系统重启?

    Android 保证自己的服务被系统kill后又被系统重启,我的博客里面有详细讲解!

    Android实现双进程守护,如何保证Service不被Kill

    Android实现双进程守护,如何保证Service不被Kill,onStartCommand方法,返回START_STICKY,手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,比较不错,但是不能保证...

    【腾讯Bugly干货分享】Android 进程保活招式大全1

    1.4 后台进程 —— Background process后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用

    Android编程防止进程被第三方软件杀死的方法

    使用小米系统的进程管理优化内存就不报错。 后来想到用Service防止软件被kill掉,查了下资料,发现google 管方就有,ForegroundService 前台服务,让服务一直以前台任务的方式运行,可以在service 的oncreate来实现...

    Android acitivity &Intent;

    如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和...

    android_system_memory_lmkd

    Android低内存杀手守护程序(lmkd)是一个进程,用于监视正在运行的Android系统的内存状态,并通过杀死最不重要的进程(使系统保持在可接受的水平)来对高内存压力做出React。 背景 过去,在Android系统上,内存监视...

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

    B.3.2 终止Android进程  B.3.3 监视Android应用程序的线程活动  B.3.4 监视堆活动  B.3.5 触发垃圾回收(GC)  B.3.6 创建和使用HPROF文件  B.4 使用内存分配(allocation)跟踪器  B.5 使用文件浏览器  B...

    安卓系统调谐器

    安卓调谐器3C Toolbox(Android Tuner)是款应用合集,合并了电量显示器小部件、系统调整和多任务切换小部件等。 功能说明: - 支持Android 4.1.x Logcat 阅读器,自动备份的已安装的应用程序 - 可设置自动终止应用...

    安卓手机助手10精简版

    Android助手Android Assistant可以帮助你终止进程,释放内存,加快手机运行速度,降低功耗,缓存清理,以帮助您的手机更高效,稳定的工作.

    (一)Android 黑白屏由来以及解决方案

    一般场景:程序安装后的第一次启动 或者 应用程序被系统完全终止后再打开。 2. 热启动: 程序任然驻留在内存中,只是被系统从后台带到了前台,因此程序可以避免对象重复初始化,加载布局和渲染。需要注意的是:如果...

    安卓调谐器 v1.0.1.zip

    安卓调谐器Android Tuner:功能很强大的一个东西,只是大家使用的时候要注意,很多关键系统功能很有可能被误操作改掉了。   安卓调谐器说明:  安卓调谐器Android Tuner是一款应用合集,合并了Battery 显示器 ...

    Linux高性能服务器编程

    13.6.4 共享内存的POSIX方法 13.6.5 共享内存实例 13.7 消息队列 13.7.1 msgget系统调用 13.7.2 msgsnd系统调用 13.7.3 msgrcv系统调用 13.7.4 msgctl系统调用 13.8 IPC命令 13.9 在进程间传递文件描述符 ...

    【最新版】wechat_devtools_1.02.2004020.dmg【亲测可用】最好的微信开发者工具

    F 修复 未使用体验评分时存在内存泄漏的情况 F 修复 切换页面偶现 WXML 面板内容丢失问题 反馈详情 F 修复 调试 WXML 面板 rpx 计算错误导致样式错乱的问题 反馈详情 F 修复 WXML 面板三目运算符不会更新的问题 ...

    chrome.exe

    任务管理器(Task Manager):非常有特色的工具,用户可以查看哪些网站占用了最多的内存、下载流量和CPU资源,有利于管理各个标签页与插件,也便于用户终止恶意操作。 诈骗和恶意程序保护:当“Google Chrome”侦测...

    Google Chrome 6.0.451.0 Dev 版(一个由Google公司开发的网页浏览器)

    ”在此之前,谷歌已经推出了手机操作系统Android,另外,数款上网本也使用了这款操作系统。  长期以来,谷歌一直致力于计算机软件对于互联网的兼容性,以取代以计算机为中心的软件开发方式。谷歌希望,能够开发出...

Global site tag (gtag.js) - Google Analytics