我知道,对于很多人,尤其是强迫症患者来说,这是一个命题,但是我们身边还是有很多智能手机用户:为什么这款手机只有600MB的3G内存是免费的?以前2G内存的手机有800MB的空闲时间。我想一键清理内存。我想定期清理记忆.
清洁和加速是移动助手吹嘘的主要功能
对于我们这些从小在Windows环境下长大的人来说,“记忆不足”是心中挥之不去的阴影。即使在今天,这个阴影依然存在于Android系统中。其实安卓和Windows有完全不同的内存管理机制,这里不太有效。
Android中可用内存只是个没意义的数字
在Windows中,可用内存越多越好,但在Android中,你完全不用在意这些数据。下图中,3GB内存的手机实际可用内存只有81MB,不要说这个系统垃圾,只能说明你的无知。
一加手机X的内存使用情况(只有81MB内存可用)
在Windows中,程序只有在需要的时候才会被分配内存。一旦程序关闭,分配的内存将作为新的可用内存释放。然而,大多数安卓应用程序没有退出菜单设计。这些运行的应用只是从前台转移到后台,大部分还留在内存中,不会也不需要主动释放,这样下次运行应用的时候就可以更快的启动。
Android可以充分利用手机的物理内存,把需要的数据(包括之前用过的数据)从硬盘读入内存,利用内存的高速来保证系统的数据访问性能,也就是可用内存越小,内存的利用率就更高,其中的数据就越多,数据访问的命中率就越高,系统也就越快.如果有人告诉你手机不能用4GB内存,那只是厂商的噱头,你可以鄙视再教育。
你可能会问,打开的应用越来越多,占用的内存总是满的,怎么办?
该出手时就出手,Android有着优秀的内存回收机制
上例中,3GB内存的手机可用内存只有81MB。如果此时打开需要256MB内存的腾讯视频,会提示“内存不足”吗?答案是否定的。
当内存不足时,内存恢复机制开始工作
实际上,Java作为Android的开发语言,并不提供任何释放内存的操作(和iOS有很大区别),由系统的内存回收机制来管理。安卓系统使用一种叫做低内存黑仔(LMK)的机制来管理内存。当记忆不足时,LMK开始挥舞屠刀杀死一些进程。那么问题来了,谁会被杀?
说到这里,我们必须花更多的时间。Android会评估一个流程的重要性,用oom_adj表示,oom_adj的值越小,重要性越高。oom_adj的值越大,进程被系统选择并杀死的可能性就越高。当OOM _ adj为0时,表示永远不会被系统终止。
Android有自己独特的进程管理,比如可以设置“内存小于22M时,以oom_adj大于14结束进程”的策略。可见oom_adj很重要,关系到过程的命运。
Android默认流程管理策略
如上表所述,在默认策略中,当内存小于24MB(6144*4K)时,LMK将杀死oom_adj为15的所有进程(即空进程)。该报警值可以手动修改,一般不需要更改。为了更好地评估流程的重要性,Android将流程分为以下六类:
前台进程(foreground):oom _ adj=0
,指正在当前屏幕上显示的进程和一些系统进程,一旦你回到主界面或切换到其它程序,当前进程变为隐藏进程,前台进程是不会杀掉的;可见进程(visible):oom_adj=1,可见进程虽然不在前台,但依然可见,如widget、输入法等,这部分进程也非常重要,基本上不可能被杀掉;
次要服务(secondary server):oom_adj=2,目前正在运行的一些服务,如下载、播放音乐,它们虽然属于次要服务,但与系统息息相关,一般也不会被杀掉;
隐藏进程(hidden):oom_adj=7,这个很容易理解,当应用从前台转入到后台后,也就成为隐藏进程了,通常一键清理内存就是清掉这些隐藏进程;
内容提供者(content provider):oom_adj=14,没有程序实体,只提供内容供别的程序去用的,比如日历供应节点,显然这类进程最有可能被先杀掉;
空进程(empty):oom_adj=15,有些程序在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息,这类进程无疑是要最先被杀掉的。
Android的内存管理机制非常适合嵌入式系统,能充分发挥出硬件的潜力,当内存越大,它的优势就越明显。
Android手机需要清内存吗?需要吗?
回到要讨论的话题,Android手机需要清内存吗?需要吗?需要吗?需要吗?结论是再明显不过:不需要!其实这个结论也适用iPhone手机,iOS在内存管理方面更为激进。
我们完全不用纠结Android手机上的可用内存大小,也不需要去一键清理内存,有时可能还会适得其反,尤其是在手机内存2GB起步3GB成主流的今天,我们会很享受Android的内存管理机制。目前硬件规格的Android手机系统流畅度上都有着很好的表现,基本上能与iOS叫板,在Android 5.1.1以上版本中如丝般顺滑都是可以期待的,至于为什么会“越用越卡”,这个问题就有点复杂,下次再单独发文讨论讨论。