在Android上,其实自身有一套完善的内存管理机制。但由于我们深受Windows和塞班的毒害,每当看到手机剩余内存只有30m时,就觉得非常不爽,总是希望通过一些工具清理一下内存,而当Toast显示已经为你清理500m内存时,就会产生无比的快感。比如管家的小火箭发射,就是利用了这种用户心理。
所以,那些内存清理工具在windows上是很有必要的,但在Android上,实属多此一举。至于进程的优先级以及memorykiller的管理机制,系统是通过oom_adj来进行管理,这个可以通过之前小管的一个邮件了解得更详细。
在android上,主要有6大类进程,分别是foregroud, visible, secondary server, hidden, content provider和empty。它们被kill的优先级,依次是emtpy > content provider > hidden > secondary server > visible > foreground。而每一类进程,系统都有一个阀值,而一旦当阀值达到最大阀值,就会按照上面的顺序进程清理进程。
举例,比如策略为6m, 8m, 16m, 20m, 22m, 24m,当系统剩余内存为22m时,就会先清理empty的进程,如果清理完毕之后,如果剩余内存还足24m, 则继续清理content provider的进程,如此类推,直到剩余内存达到24m以上为止。
根据各类进程的作用,以及用户的类型,我们可以配置出各种内存分配模式:
1) 长时间只关注某一个应用,比如游戏,浏览器等——极客模式;
2) 需要在多个应用中来往跳转,比如QQ、浏览器,微信等——多变模式;
3) 只关注来电,短信,邮件等商务——商务模式;
4) 等等。
有root的情况下,通过修改系统文件/sys/module/lowmemorykiller/parameters/minfree,即可动态修改这六个值。
下面是关于这六类进程的作用简单介绍, 从网上找到的:
- 前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。
- 可见进程(visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)
- 次要服务(secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
- 后台进程(hidden):虽然作者用了hidden这个词,但实际即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点
- 内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权
- 空进程(empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。
当手机剩余内存比较时,手机就变得比较慢的,原因是因为emtpy 的进程的阀值设置得太低了,导致系统在剩余内存很低的情况下,才开始清理进程。当剩余内存比较低,但还没有达到清理内存的条件时,系统整体就会比较卡。
因此,我们的策略,主要是解决两方面的问题:
1. 提升阀值的上限,空出更多的剩余空间,以提升系统整体的运行速度;
2. 各个进程的阀值要拉开,要形成梯度,使得进程管理机制更有效工作;