大家其实都或多或少知道,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后能够自动重启,开发者需要采取一些策略。以下是一些关键知识点: 1. **START_STICKY**: 当...
在Android操作系统中,进程管理是系统资源调度的关键部分,它涉及到应用程序的运行、内存的分配以及用户界面的响应性。本项目"android上的进程管理软件"提供了一个初级开发者研究和理解Android进程管理机制的实例。...
在安卓(Android)系统中,应用进程的管理是操作系统的核心任务之一。开发者有时需要了解如何在源码层面强行结束一个APP进程,这可能是为了调试、性能优化或是其他特殊需求。本篇文章将深入探讨这一主题,从Android...
这类进程在系统内存不足时会被优先回收。 5. 空进程:没有包含任何应用程序组件的进程,是最后被结束的类型。 针对Android的这种机制,开发者可以采取以下策略来提高进程保活的几率: 1. 使用前台服务:通过创建一...
6. 监听主进程状态:在守护进程中监听主应用进程的生命周期,当检测到主进程终止时,可以采取相应措施,如重新启动主应用。 双进程守护的优点在于提高了服务的稳定性和持久性,但同时也带来了额外的系统资源消耗。...
当系统需要回收内存时,会先终止没有绑定到前台组件的服务进程。 4. **后台进程(Background Process)**:包含已启动但不在前台的Activity。这类进程对用户体验影响较小,系统会在需要时逐步回收它们。 5. **空...
Android系统会根据进程的重要性和系统资源的需求来决定是否保留或终止进程。本文将详细探讨Android进程的五种优先级以及系统如何进行进程回收。 1. **进程优先级** Android将进程分为五个等级,按重要性排序: - ...
Android中的进程有五种状态:空进程、可终止进程、缓存进程、前台进程和可见进程,每个状态都有不同的存活优先级。系统会按照这些优先级依次杀死进程以回收内存。 2. **防止进程被杀死** - **服务(Services)**...
Android系统通过一个名为"oom_adj"的数值评估进程优先级,值越大,进程被终止的可能性越高。 Android虚拟机的内存结构包括几个关键区域:加载的类信息存储在dex文件中,是线程共享的;堆空间存放对象实例,同样为...
而OOM Killer机制则是当系统内存耗尽时,内核会选择性地杀死一些进程以释放内存,它通过一系列策略和标准来决定哪些进程会被终止。 Android在继承Linux内存管理的基础上,进行了特定的优化和调整以适应移动设备的...
Android实现双进程守护,如何保证Service不被Kill,onStartCommand方法,返回START_STICKY,手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,比较不错,但是不能保证...
在决定结束进程时,通常不建议终止前台或重要服务,以免影响用户体验。开发者需要根据`RunningAppProcessInfo`的`importance`字段来判断。 5. **结束进程**: 使用`ActivityManager`的`killBackgroundProcesses()`...
在Android系统中,应用进程通常在用户不使用它们时被系统自动回收,以优化系统资源的使用。然而,有些应用程序需要在后台持续运行,比如音乐播放器、消息推送服务等,这时就需要用到"守护进程"(AppDaemon)来确保...
5. 权限管理:由于涉及系统级别的操作,可能需要请求一些特殊的权限,例如`android.permission.KILL_BACKGROUND_PROCESSES`,以允许你的服务终止其他进程。 6. 错误处理和调试:为了保证服务的稳定性和可靠性,务必...
系统会优先保留重要性高的进程,当内存紧张时,会依次终止重要性较低的进程。 - 前台进程:包含用户当前交互的Activity、与前台Activity绑定的服务、运行在前台的服务(通过startForeground()声明)或正在进行生命...
在Android系统中,每个应用程序都运行在一个独立的进程中,这些进程有不同的优先级,这直接影响到它们在内存紧张时是否会被系统回收。当我们开发一个应用,尤其是涉及到如相机这样需要长时间运行或者频繁交互的服务...
安卓系统会根据内存压力自动管理和终止进程,优先级较低的进程可能会被先杀掉。通常,当用户离开一个应用,其进程并不立即结束,而是进入后台状态,直到系统需要更多内存时才可能被清理。而服务(Service)则可以...
当系统内存不足时,它会依据进程的重要性顺序决定哪些进程应该被终止。被终止的进程中的组件会被销毁,当组件需要再次运行时,系统会重新启动进程。这涉及到Android的组件生命周期管理,如Activity的`onCreate()`、`...
当系统内存不足时,会优先关闭非关键或不活跃的应用程序,以释放更多的内存空间供其他应用使用。 2. **进程调度**:Android使用一种名为“完全公平调度器”(CFS, Completely Fair Scheduler)来管理CPU资源分配。...
"Kill123"可能是该工具的一个特定功能或代码命名,暗示了其核心功能是终止不必要的后台进程,以释放系统资源。在Android设备上,后台应用可能会持续运行,消耗电池电量,占用内存,甚至导致设备变慢或卡顿。因此,一...