Android OOM与常驻内存进程

与Linux系统相同,Android中每一个process也有一个自己的优先级,在PC系统中,进程或者线程的优先级决定了其获得运行资源的多少。而像iOS与Android系统中,优先级除了决定进程获得资源的多少之外,还决定了当系统处于资源紧张状态时,进程所能存活的时间。因为在Mobile操作系统中,都有OOM处理机制,即当系统资源紧张时,OS会根据一定的策略选择kill一掉一些进程,从而使系统拥有更多的资源可以运行下去,或者使优先级更高的进程能够有足够的资源运行。我们先从OOM机制说起。

OOM与Android Low Memory Killer

在多任务操作系统中,多个进程同时进驻内存当中,OS通过内存分页与换页机制保证各个进程能够得到足够的内存,以便继续运行下去。但是随着进驻内存的进程的增多,以及各个进程对内存需求的增加,系统可能在某一时刻达到一种状态,即当进程A要求需要请求新的内存页时,OS无法找到空闲的内存页分配给它,也就是说,当前所有的内存页均处于Dirty状态,而且无法被置换出内存,在这种情况下,OS的OOM机制将会起作用。OOM会根据一定的规则,选出‘优先级’最低的进程,将其杀掉,从而释放内存供系统使用。

可以看到,OOM能够保证系统在资源紧张的情况下继续运行下去,但是在iOS与Android系统当中,这种机制的OOM扔不能满足需求。

为了改进用户体验,Android的background app是处于内存当中的,以便用户能够快速的在app间切换,并且Android提倡保存app的当前状态,以使用户在回到app中时,页面的状态与用户离开时一致。为了达到这种友好的体验,单纯的OOM便显示出了不足。因为在OS的OOM机制被促发时,内存中以没有可用内存页,及app无法继续运行,无法保存自己的状态。因此,Android在Linuxe的OOM Killer之外,引入了 Low-Memory Killer。LMK的运行机制如下:

Low memory driver中定义了不同的内存使用阈值,当内存使用超过预定的阈值时,系统就会向process发出相关信息(memory warning),app在收到memory warning后,可以保存自己的当前状态;如果系统资源进一步紧张,low memory killer就会选择kill一些background process

Android常驻内存进程

哪些app是可以优先被kill掉,而哪些是需要保留的,Android应该是综合考虑了多种因素(优先级、app类型、LRU?)。大致原则是,foreground app永远是优先级最高的,基本上不会被kill掉,除非系统都要关闭了:(;系统进程,相当于kernel级别的进程一定需要保留。

在我们日常的app开发中,我们无法保证app一直处于最前端,但是有些service,像音乐播放、屏幕录像等,又需要常驻内存,这时我们就需要保证这种service一致处于前台状态,及一直拥有foreground priority, 我们可以通过startForeground()方法与Notification结合来达到此目的