首先你要知道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,在程序退出後,依然會在進程中駐留一個空進程,這個進程裏沒有任何數據在運行,做用每每是提升該程序下次的啓動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最早終止的。