Android内存管理机制

首先你要知道Android系统是基于Linux2.6内核开发的。浏览器

而Linux与Windows在内存管理上是不一样的。使用过Linux系统的人都知道,Linux系统的空闲的内存每每不多,给人感受好像内存不够用了。其实,否则,这正式Linux内存管理的一个优秀的特性。不管内存的物理内存有多大,Linux系统都将充分利用,会将一些程序调用过的数据读入内存中,利用内存读写的高速特性来提供Linux系统的数据访问性能。而Windows是在须要内存时,才为应用程序分配内存,并不能充分的利用大容量内存空间。ide

Android针对移动端,对Linux进行了内存管理上的优化。Linux在进程活动中止后就结束进程。而Android会将中止后的进程保存到内存中,直到系统须要更多内存为止。这些保存在内存中的程序并不会影响系统的运行速度,而且当用户再次开启这些进程时,能提高进程的开启速度。性能

大多数人习惯清空内存的作法,实际上是不恰当的。影响系统运行速度的并非内存而是占用CPU的进程。而优化内存以及优化以后再从新开启进程都是一很占用CPU资源的操做。因此,想经过优化内存进而提高手机运行速度的作法,每每拔苗助长(并且很耗电)。优化

那随着不断的开启不一样的程序,内存不就很容易满了吗?spa

Android何时去回收内存呢?server

Android进行内存调度有一个阀值。只有低于这个值的时候,系统才会按一个列表杀死进程,回收内存。排序

那么这个列表这个系统是怎么定义的呢?进程

一般认为:Android是依据LRU(last recently used)列表,将程序进行排序。而排序规则是oom_adj。这个值越大,进程被系统终止的可能性就越大。内存

前台进程的oom_adj值为0,当它不可访问时,会得到更高的oom_obj。资源

Android将进程分为六大类:

1.前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。举例来讲,Dialer Storage,GoogleSearch等系统进程就是前台进程;再举例来讲,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(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,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,做用每每是提升该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最早终止的。