經(jīng)??匆娪腥送扑]一鍵釋放內(nèi)存的內(nèi)存管理軟件,或者說自己的ROM精簡后可用內(nèi)存有500+甚至600+……我個人是很不理解了……

     首先,從內(nèi)存的原理說起。這個說起來比較長篇,舉個簡單的例子來說明:你去圖書館看書,書都在書架上,你會有一張桌子。對于電腦/手機來說,書架就是硬盤或者內(nèi)置的ROM/SD卡,桌子就是內(nèi)存,你就是CPU,書就是數(shù)據(jù)(程序本身也是數(shù)據(jù),只是一種比較特殊的數(shù)據(jù)而已)。你看書的時候是從書架上把書取出來,放在桌子上看;CPU需要數(shù)據(jù)的時候,是從硬盤/SD卡把數(shù)據(jù)載入到內(nèi)存之后,進行處理。

      那么大內(nèi)存有什么好處呢?用圖書館的例子繼續(xù)說明:如果你的桌子很小,剛看了幾本書,你的桌子上已經(jīng)擺滿了,但現(xiàn)在你需要參考幾本書架上的書,你只能把桌子上的若干本書放回書架(假設(shè)書籍不能堆疊著放),然后到書架去拿新書。但事實上,很有可能你放回書架的書呆會還需要繼續(xù)看,你不得不在看完這幾本書后,再把幾本暫時不看的書放回書架,把剛才放回書架的書又拿出來……最后的結(jié)果是你一整天的時間,有大部分在不停的取書-放書-取書這個循環(huán)中浪費掉。而如果桌子足夠大的話,就沒有這個問題,你完全可以把整一個書架的書都放到桌子上,需要哪本就看哪本。

      對于1G ram的手機來講,經(jīng)常使用一鍵清理軟件,把可用內(nèi)存保持在500+,就相當于你本來有一張大桌子,但為了看著桌子干凈整潔,所以當桌子上的書超過一定數(shù)量之后,你就把除了手上在看的那本書以外,全部都放回書架上……這個真的很沒有必要,也很浪費資源。

Android本身其實有很不錯的內(nèi)存回收機制,通常叫minfree:

      1、Android自身并沒有所謂的關(guān)閉進程的說法 每當我們要退出一個進程回到桌面/打開另一個程序的時候我們只能按"返回鍵". 而當我們按下"返回鍵"后,該進程并沒有真正的關(guān)閉,仍然保存在內(nèi)存中. 這樣在下次調(diào)用的時候可以更快的打開該程序

      2、要想真正的關(guān)閉一個已打開的進程,除了用第三方軟件(例如advanced task manager)外,還有一個,那就是當Android系統(tǒng)認為當時已經(jīng)沒有足夠的內(nèi)存來運行新的進程,需要關(guān)閉一些雖然已經(jīng)開著,但是沒有用了(具體怎樣一個進程才會被Android系統(tǒng)認為是"沒有用"下面就要討論到)的進程

      3、ActivityManagerService.java記錄著每一個進程的優(yōu)先級. 一個進程的oom_adj值也就代表了它的優(yōu)先級. oom_adj值越高代表該進程優(yōu)先級越低. 一個正在使用的進程的oom_adj值為0,一旦我們按下返回鍵,這個進程就會得到一個更高的oom_adj值(更低的優(yōu)先級). 具體多少取決于該進程在LRU(last recently used) list的位置.(未證實)

具體的細節(jié)保存在Android源文件drivers/misc/lowmemorykiller.c里

      4、Android將進程分為6個等級,它們按優(yōu)先級順序由高到低依次是:

A、foreground app:前臺程序,但事實上除了你正在運行的前臺程序,還包括一些系統(tǒng)應(yīng)用,例如啟動器(或者叫桌面)、撥號程序、短信、聯(lián)系人信息、USB服務(wù)等,對A4來說,還有Blur、溫度監(jiān)控、Moto門戶、指紋等。

B、visible app:“可見”程序,一般來說是輸入法,對于A4來說,還有通話錄音(國行)和進程管理。

C、secondary service:服務(wù)程序,不過不包括系統(tǒng)服務(wù)。這些一般是第三方軟件的后臺服務(wù)了,在我的手機上,Go天氣、七鍵開關(guān)、同花順、PC助手之類的。

D、hidden app:前臺(不包括系統(tǒng)應(yīng)用),如果按下“home”回到桌面或者通過長按“home”以及程序本身提供的切換、調(diào)用功能切換到其他程序的時候,這個程序就變成hidden app。

E、content provider:直譯就是內(nèi)容提供者了。事實上這是沒有客戶端的secondary service,這個有點不好解釋,舉例來說明吧,A4有一個Blur相關(guān)的應(yīng)用叫“切換小部件”,就是一個contend provider,如果你在桌面上通過添加“Moto小部件”增加Wifi/GPS/3G/藍牙中的一個或者多個切換的桌面插件,它就有了客戶端,變成了secondary service,如果你再把所有的切換插件從桌面刪除,它就沒有客戶端了,又變回content provider。

F、empty app:空應(yīng)用。這個空進程有兩種,第一種是你運行的程序,通過程序提供的退出操作退出程序,或者主界面按返回鍵退出到桌面的程序,并不會馬上從內(nèi)存釋放掉這個程序的數(shù)據(jù),android會把程序數(shù)據(jù)保留在內(nèi)存里,這樣你下次調(diào)用這個程序的時候,就不需要從ROM或者程序存儲里面重新讀取程序了。第二種,如果可用內(nèi)存大于minfree里面的empty app設(shè)置,android會在空閑的時候,把沒有運行過的程序數(shù)據(jù)讀進內(nèi)存。沒錯,就是你開機之后一直都沒有運行過的程序!

      當然不會是所有安裝了的程序都會預(yù)加載,從網(wǎng)上的資料觀察來看,似乎在桌面上有快捷方式的,或者用的比較多的應(yīng)用,Android都會預(yù)加載進內(nèi)存。對于一般的釋放內(nèi)存軟件來說,釋放內(nèi)存會把D、E、F三種程序結(jié)束掉,在A4上很搞笑的一件事情是,如果是未經(jīng)修改(精簡自帶應(yīng)用不算修改)的ROM,系統(tǒng)空閑的時候會自動讀取存儲,把結(jié)束掉的程序重新載入到內(nèi)存(因為剛剛運行過,預(yù)載優(yōu)先級會高一點),直到所有符合預(yù)載規(guī)則的程序都已經(jīng)載入內(nèi)存,或者可用內(nèi)存低于minfree里面empty app(A4默認是)的設(shè)置值為止……也就是說:內(nèi)存釋放軟件不但做的是無用功,而且增加了系統(tǒng)讀取程序數(shù)據(jù)的操作。

      追求高可用內(nèi)存的朋友,估計很大一部分是從256M/384M內(nèi)存的手機過來,又或者習慣了Windows的內(nèi)存管理方式的,但對于Android來說,其實只要可用內(nèi)存大于你馬上要運行的程序所需要的內(nèi)存,不需要在運行程序的時候,系統(tǒng)要按照預(yù)設(shè)的規(guī)則結(jié)束掉一部分程序釋放出足夠的可用內(nèi)存就OK了。也就是說,只要minfree里面empty app的設(shè)置值比你通常要運行的最占用內(nèi)存的程序所需要的內(nèi)存大一點就可以了。

      按照標準Android應(yīng)用設(shè)計的程序,處于第四級、第五級的時候也不會消耗CPU資源的,而常見的內(nèi)存釋放軟件也不會強制結(jié)束前三級的程序來釋放內(nèi)存,所以如果某個應(yīng)用后臺會耗電的話,只能說這個應(yīng)用的開發(fā)者在設(shè)計的時候沒有很好的理解Android應(yīng)用的架構(gòu),或者出于其他原因,使用了service的方式運行,又或者在service沒有client的時候還在進行一些操作。對于這樣的程序,用任務(wù)管理軟件單獨殺掉應(yīng)用程序的進程其實更好一點。