经常看见有人推荐一键释放内存的内存管理软件,或者说自己的ROM精简后可用内存有500+甚至600+……我个人是很不理解了……
首先,从内存的原理说起。这个说起来比较长篇,举个简单的例子来说明:你去图书馆看书,书都在书架上,你会有一张桌子。对于电脑/手机来说,书架就是硬盘或者内置的ROM/SD卡,桌子就是内存,你就是CPU,书就是数据(程序本身也是数据,只是一种比较特殊的数据而已)。你看书的时候是从书架上把书取出来,放在桌子上看;CPU需要数据的时候,是从硬盘/SD卡把数据载入到内存之后,进行处理。
那么大内存有什么好处呢?用图书馆的例子继续说明:如果你的桌子很小,刚看了几本书,你的桌子上已经摆满了,但现在你需要参考几本书架上的书,你只能把桌子上的若干本书放回书架(假设书籍不能堆叠着放),然后到书架去拿新书。但事实上,很有可能你放回书架的书呆会还需要继续看,你不得不在看完这几本书后,再把几本暂时不看的书放回书架,把刚才放回书架的书又拿出来……最后的结果是你一整天的时间,有大部分在不停的取书-放书-取书这个循环中浪费掉。而如果桌子足够大的话,就没有这个问题,你完全可以把整一个书架的书都放到桌子上,需要哪本就看哪本。
对于1G ram的手机来讲,经常使用一键清理软件,把可用内存保持在500+,就相当于你本来有一张大桌子,但为了看着桌子干净整洁,所以当桌子上的书超过一定数量之后,你就把除了手上在看的那本书以外,全部都放回书架上……这个真的很没有必要,也很浪费资源。
Android本身其实有很不错的内存回收机制,通常叫minfree:
1、Android自身并没有所谓的关闭进程的说法 每当我们要退出一个进程回到桌面/打开另一个程序的时候我们只能按"返回键". 而当我们按下"返回键"后,该进程并没有真正的关闭,仍然保存在内存中. 这样在下次调用的时候可以更快的打开该程序
2、要想真正的关闭一个已打开的进程,除了用第三方软件(例如advanced task manager)外,还有一个,那就是当Android系统认为当时已经没有足够的内存来运行新的进程,需要关闭一些虽然已经开着,但是没有用了(具体怎样一个进程才会被Android系统认为是"没有用"下面就要讨论到)的进程
3、ActivityManagerService.java记录着每一个进程的优先级. 一个进程的oom_adj值也就代表了它的优先级. oom_adj值越高代表该进程优先级越低. 一个正在使用的进程的oom_adj值为0,一旦我们按下返回键,这个进程就会得到一个更高的oom_adj值(更低的优先级). 具体多少取决于该进程在LRU(last recently used) list的位置.(未证实)
具体的细节保存在Android源文件drivers/misc/lowmemorykiller.c里
4、Android将进程分为6个等级,它们按优先级顺序由高到低依次是:
A、foreground app:前台程序,但事实上除了你正在运行的前台程序,还包括一些系统应用,例如启动器(或者叫桌面)、拨号程序、短信、联系人信息、USB服务等,对A4来说,还有Blur、温度监控、Moto门户、指纹等。
B、visible app:“可见”程序,一般来说是输入法,对于A4来说,还有通话录音(国行)和进程管理。
C、secondary service:服务程序,不过不包括系统服务。这些一般是第三方软件的后台服务了,在我的手机上,Go天气、七键开关、同花顺、PC助手之类的。
D、hidden app:前台(不包括系统应用),如果按下“home”回到桌面或者通过长按“home”以及程序本身提供的切换、调用功能切换到其他程序的时候,这个程序就变成hidden app。
E、content provider:直译就是内容提供者了。事实上这是没有客户端的secondary service,这个有点不好解释,举例来说明吧,A4有一个Blur相关的应用叫“切换小部件”,就是一个contend provider,如果你在桌面上通过添加“Moto小部件”增加Wifi/GPS/3G/蓝牙中的一个或者多个切换的桌面插件,它就有了客户端,变成了secondary service,如果你再把所有的切换插件从桌面删除,它就没有客户端了,又变回content provider。
F、empty app:空应用。这个空进程有两种,第一种是你运行的程序,通过程序提供的退出操作退出程序,或者主界面按返回键退出到桌面的程序,并不会马上从内存释放掉这个程序的数据,android会把程序数据保留在内存里,这样你下次调用这个程序的时候,就不需要从ROM或者程序存储里面重新读取程序了。第二种,如果可用内存大于minfree里面的empty app设置,android会在空闲的时候,把没有运行过的程序数据读进内存。没错,就是你开机之后一直都没有运行过的程序!
当然不会是所有安装了的程序都会预加载,从网上的资料观察来看,似乎在桌面上有快捷方式的,或者用的比较多的应用,Android都会预加载进内存。对于一般的释放内存软件来说,释放内存会把D、E、F三种程序结束掉,在A4上很搞笑的一件事情是,如果是未经修改(精简自带应用不算修改)的ROM,系统空闲的时候会自动读取存储,把结束掉的程序重新载入到内存(因为刚刚运行过,预载优先级会高一点),直到所有符合预载规则的程序都已经载入内存,或者可用内存低于minfree里面empty app(A4默认是)的设置值为止……也就是说:内存释放软件不但做的是无用功,而且增加了系统读取程序数据的操作。
追求高可用内存的朋友,估计很大一部分是从256M/384M内存的手机过来,又或者习惯了Windows的内存管理方式的,但对于Android来说,其实只要可用内存大于你马上要运行的程序所需要的内存,不需要在运行程序的时候,系统要按照预设的规则结束掉一部分程序释放出足够的可用内存就OK了。也就是说,只要minfree里面empty app的设置值比你通常要运行的最占用内存的程序所需要的内存大一点就可以了。
按照标准Android应用设计的程序,处于第四级、第五级的时候也不会消耗CPU资源的,而常见的内存释放软件也不会强制结束前三级的程序来释放内存,所以如果某个应用后台会耗电的话,只能说这个应用的开发者在设计的时候没有很好的理解Android应用的架构,或者出于其他原因,使用了service的方式运行,又或者在service没有client的时候还在进行一些操作。对于这样的程序,用任务管理软件单独杀掉应用程序的进程其实更好一点。