Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中, 直到系统需要更多内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。

那Android什么时候结束进程?结束哪个进程呢?Android是依据一个名为LRU(last recently used 最近使用过的程序)列表,将程序进行排序,根据进程的重要性以及触发内存清理的阀值,选择性的结束列表中的进程。

一、进程的重要性

     Android系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程。系统会根据“oom_adj”来判断需要优先结束哪些进程,一般来说,“oom_adj”的值越大,该进程被系统选中终止的可能就越高,前台程序的“oom_adj”值为0,这意味着它不会被系统终止。Android将进程分为6个等级,foreground(前台进程)、visible(可见进程)、secondary server(次要服务)、hidden(后台进程)、content provider(内容供应节点)、empty(空进程)它们按优先级顺序由高到低依次是:

1.前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程 (foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。

2.可见进程(visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法 等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被 终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)

3.次要服务(secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管 理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息 息相关,我们时常需要用到它们,所以也太希望他们被终止

4.后台进程(hidden):虽然作者用了hidden这个词,但实际即是后台进程(background),就是 我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦 我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background),后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再 次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户 根据自己的使用习惯找到一个平衡点

5.内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权

6.空进程(empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。

结束进程的顺序:Empty>Content Provider>Hidden>Secondary Server>Visible>Foreground。

查看现在的设置可以:
shell@android:/sys/module/lowmemorykiller/parameters $ cat adj                
0,1,2,4,9,15

0,1,2,4,9,15的oom_adj值对应Foreground>Visible>Secondary Server>Hidden>Content Provider>Empty



二、触发内存清理的阀值

    Android可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。

    查看现在的设置可以:
    shell@android:/sys/module/lowmemorykiller/parameters $ cat minfree             
       3599,4881,6164,8212,9495,11294

对应Foreground>Visible>Secondary Server>Hidden>Content Provider>Empty
    显示出的应该是6个数字,以逗号隔开,例如:
    3599,4881,6164,8212,9495,11294注意这些数字的单位是 page. 1 page = 4 kb.上面的六个数字对应的就是(MB): 14,19,24,32,37,44

这些数字也就是对应的内存阀值,一旦低于该值,Android便开始按顺序关闭进程. 因此Android开始结束优先级最低的EMPTY_APP当可用内存小于44MB(11294*4/1024).




附加oom_adj配置的网络参考

进程管理策略设置原则:
前台进程、可见进程和次要服务是与用户体验息息相关的内容,这部分的进程管理策略要相对保守,给这些进程留下足够的运行空间。
压榨无用进程,腾出内存空间给主要程序使用。

下面笔者总结了几种设置方式,适应不同的使用需要:

游戏玩家/重度浏览器使用者配置:
用户特点:长时间专注于某一特定的,高内存需求的程序,对多任务的需求不高配置参数: 1.Foreground:6
2.Visible:8
3.Secondary Server:16
4.Hiden App:80
5.Content Provider:90
6.Empty:100
配置理念:压榨后台进程,内容供应节点和空进程,将内存尽可能多得留给前台进程和系统,提升游戏速度和浏览器体验
优点:程序启动和运行的速度最快
缺点:多任务处理不理想,开启程序较多时,后台进程会被终止多任务配置:

多任务配置
用户特点:同时运行多个应用程序,需要经常在多个程序间切换配置参数:
1.Foreground:6
2.Visible:8
3.Secondary Server:16
4.Hiden App:20
5.Content Provider:60
6.Empty:100
配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任务的处理能力
优点:运行多个程序时,由于可支配内存较多,后台程序不容易被终止
缺点:程序启动的速度和整体系统的运行速度可能会比游戏玩家配置略慢一些,由于经常运行多任务,平时系统的响应速度会受到一定影响

轻度用户/女生专用配置
用户特点:手机的主要功能是短信和电话,偶尔用用相机自拍配置参数:
1.Foreground:6
2.Visible:8
3.Secondary Server:16
4.Hiden App:24
5.Content Provider:32
6.Empty:48
配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任务的处理能力
优点:比较均衡的配置,提升了系统的可用内存,使得系统的整体速度得到了提高,拉开了各级进程的管理策略层次,使得管理机制更有效率
缺点:比较均衡的配置,无明显缺点

总结阐述完了内存管理的机制,并推荐了一些配置参数,但这些参数并不一定适用于所有人,大家也可以根据自己实际的使用习惯调整这些参数的设置。



更多相关文章

  1. [Android]你不知道的Android进程化(3)--进程等级
  2. Android中native进程内存泄露的调试技巧
  3. Android应用程序基础知识
  4. Android进程的so注入--Poison(稳定注入版)
  5. android进程创建分析
  6. 详解android应用程序的反编译
  7. 高焕堂《android从程序员到架构师之路》 YY讲坛活动直面架构设计
  8. Android 进程间通信之LocalSocket
  9. Android学习手记:第一个应用程序!

随机推荐

  1. 屏幕亮屏、熄屏监听代码
  2. ViewModel + SavedState
  3. Android(安卓)利用广播接收器启动服务
  4. Android--Notification
  5. Android(安卓)网络状态操作
  6. Android与Javascript交互示例(三)
  7. Holo Dark TabWidget style for Holo Lig
  8. 图形处理
  9. android canvas 编辑bitmap画虚线
  10. Android:Handler,内部类导致的可能内存泄露