什么是Android 进程、Android 进程的生命周期、Android 进程回收策略

以下内容原文来自:https://yq.aliyun.com/articles/666425

1.  Android 进程   

       默认情况下,同一 APP 的所有组件均运行在相同的进程中,但是也可以根据需要,通过在清单文件中配置来控制某些组件的所属进程。

内存不足的情况下,Android 系统会选择 kill 某一进程来释放该进程占用的内存,供其它为用户提供更为紧急服务的进程使用。在被关闭的进程中运行的组件也会随着进程的关闭而销毁。

决定 kill 哪个进程时,Android 系统将权衡所有进程对用户的相对重要程度。例如:相对于托管可见 Activity 的进程而言,更有可能 kill 托管不可见 Activity 的进程。因此,是否终止 kill 某个进程取决于该进程中所运行组件的状态。

2、Android 进程的生命周期

Android 系统会尽量长时间地保持 APP 进程的运行,但为了新建进程或者运行更重要的进程,最终要 kill 旧进程来回收内存。为了确定保留或者 kill 哪些进程,系统会根据进程中正在运行组件的状态,将每个进程放入重要性层次结构中,必要时,系统会首先kill重要性最低的进程,其次kill重要性略低的进程,以此类推。

重要性层次结构一共有5级。以下列表按照重要程度列出了各类进程(第一类进程最重要,将是最后一类被终止的进程):

1、前台进程

用户当前操作的进程。一个进程满足以下任一条件 ,即视为前台进程:

  • 托管用户正在交互的 Activity(已调用 onResume() 方法)。

  • 托管某个 Service ,且 Service 绑定到用户正在交互的 Activity。

  • 托管正在“前台”运行的 Service(服务已调用startForeground())。

  • 托管正在执行生命周期回调的 Service( onCreate() 、 onStart() 或 onDestory() )。

  • 托管正在执行 onReceive() 方法的 BroadcastReceiver。

通常,任意时间的前台进程数据都不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会 kill 它们。

2、可见进程

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:

  • 托管不在前台、但仍对用户可见的 Activity(已调用 onPause() 方法)。如:前台 Activity 启动了一个对话框,允许在其后面显示上一个 Activity。

  • 托管绑定到可见(或前台)的 Activity 的 Service。

可见进程被视为及其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会kill这些进程。

3、服务进程

正在运行已使用 startService() 方法启动的 Service 且不属于上述两个更高类别进程的进程。

尽管服务进程与用户可见内容没有直接关联,但是它们通常在执行一些用户比较关心的操作(如:在后台播放音乐或从网络下载数据等),因此,除非内部不足以维持所有前台进程和可见进程同时运行,否则系统不会 kill 这些进程。

4、后台进程

托管目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。

后台进程对用户体验没有直接影响,系统可能随时会 kill 它们,以回收内存提供给前台进程、可见进程、服务进程使用。通常会有很多后台进程同时运行,系统将它们保存在 LRU(最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。

5、空进程

不包含任何活动组件的进程。

保留这种进程的唯一目的是缓存,以缩短下次在其中运行的组件的启动时间。为使系统总体资源在进程缓存和底层内核缓存之间保持平衡,系统往往会kill这些进程。

根据进程中当前活动的组件的重要程度,Android 系统会将进程评定为可能达到的最高级别。比如,托管服务和可见 Activity 的进程,系统会将其评定为可见进程,而不是服务进程。

此外,一个进程的级别可能会因为其他进程对其依赖而有所提高,即服务于另一进程的进程其级别不会低于其服务的进程。例如,进程 A 中的 Service 绑定到进程 B 中的组件,则进程 A 始终被视为至少和进程 B 同等级别。

由于运行 Service 的进程其级别高于托管后台 Activity 的进程,因此在要做长时间后台操作的 Activity 中最好为该操作启动 Service,而不是简单的创建子线程,当操作有可能比 Activity 更持久时更需如此。例如,需要上传较大图片或较大文件的 Activity,应该启动 Service 来执行上传操作,这样,即使 Activity 被销毁,Service 仍能在后台继续执行上传操作。使用 Service 执行较长耗时操作,可以保证不管 Activity 发生什么情况,该操作至少有服务进程的优先级。同理,使用广播接收器时,也当如此。

3、Android 进程回收策略

上文提到了,Android 系统在内存不足以创建新进程或运行更重要的进程时,会 kill 重要性低的进程来回收内存。也总结了 Android 系统进程的重要级别,那么具体的进程回收策略是什么呢?

Android 系统回收进程内存的机制叫 LMS ( Low Memory Killer )机制,是一种根据 oom_adj 阈值级别触发相应力度的内存回收的机制。oom_adj 代表进程的优先级,数值越高,优先级越低,越容易被杀死。

关于 oom_adj 的说明如下:

b60960d7af978d38273750d4ba2e83410e1f29bc

OOM_ADJ

其中红色部分代表比较容易被杀死的 Android 进程( OOM_ADJ>=4 ),绿色部分表示不容易被杀死的 Android 进程,其他表示非 Android 进程(纯 Linux 进程)。在 LMS 回收内存时会根据进程的级别优先杀死 OOM_ADJ 比较大的进程,对于优先级相同的进程则进一步受到进程所占内存和进程存活时间的影响。

Android 中进程可能被杀死的情况如下:

307a142ddb414fb5602c7a61fabf708c5f1ba6b0

Android进程可能被杀死情况

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值