

像我們這些在Windows陪伴下成長(zhǎng)起來(lái)的玩家,“內(nèi)存不足”是留存在心底揮之不去的陰影,即便到了今天,到了Android系統(tǒng),這個(gè)陰影依舊。實(shí)際上Android有著與Windows完全不一樣的內(nèi)存管理機(jī)制,Windows上的那一套,在這兒并不是行之有效的。
在Windows的內(nèi)存分配機(jī)制中,只有應(yīng)用程序需要用到內(nèi)存時(shí),才會(huì)為程序分配內(nèi)存,一旦這個(gè)程序被關(guān)閉,分配的內(nèi)存也就釋放出來(lái)成為新的可用內(nèi)存。然而,絕大多數(shù)Android應(yīng)用都沒(méi)有退出內(nèi)存駐留的設(shè)計(jì),這些運(yùn)行過(guò)的應(yīng)用無(wú)非是從前臺(tái)轉(zhuǎn)入到后臺(tái)。
其實(shí),對(duì)于很多用戶而言,清空駐留內(nèi)存是個(gè)顯而易見(jiàn)的偽命題,但是在我們周圍,還是有很多智能手機(jī)的用戶不時(shí)抱怨:怎么這個(gè)手機(jī)標(biāo)配3GB內(nèi)存,但空閑的怎么只有600MB呢?以前那個(gè)2GB內(nèi)存的手機(jī)都有800MB的空閑,我要一鍵清理內(nèi)存,我要定時(shí)清理內(nèi)存,等等。
如今,像我們這些在Windows陪伴下成長(zhǎng)起來(lái)的玩家,“內(nèi)存不足”是留存在心底揮之不去的陰影,即便到了今天,到了Android系統(tǒng),這個(gè)陰影依舊。實(shí)際上Android有著與Windows完全不一樣的內(nèi)存管理機(jī)制,Windows上的那一套,在這兒并不是行之有效的。
Android中可用內(nèi)存只是個(gè)沒(méi)意義的數(shù)字
在Windows中,可用內(nèi)存自然是越多越好,但在Android中,則完全不必在意這個(gè)數(shù)據(jù)。在下圖中,有著3GB內(nèi)存的某款手機(jī),實(shí)際可用內(nèi)存只有1.3GB左右(MemFree+Cached),這時(shí)您可千萬(wàn)別說(shuō)這個(gè)系統(tǒng)好垃圾-事實(shí)也并非如此,這只能顯得自己有些無(wú)知。
正如我們所知道的那樣,在Windows系統(tǒng)中只有需要用到內(nèi)存時(shí)才會(huì)為程序分配內(nèi)存,一旦這個(gè)程序被關(guān)閉,分配的內(nèi)存也就釋放出來(lái)成為新的可用內(nèi)存。然而絕大多數(shù)Android應(yīng)用都沒(méi)有類似的內(nèi)存退出設(shè)計(jì),這些運(yùn)行過(guò)的應(yīng)用無(wú)非是從前臺(tái)轉(zhuǎn)入到后臺(tái),大多數(shù)應(yīng)用依舊保留在內(nèi)存中并不會(huì)也不需要主動(dòng)釋放,這樣在下次再運(yùn)行該應(yīng)用時(shí),可以更快速的予以啟動(dòng)。
無(wú)論手機(jī)的物理內(nèi)存有多大,Android都能將其充分利用,將需要用到(包括之前用過(guò)的)的數(shù)據(jù)從存儲(chǔ)器讀入到內(nèi)存,利用內(nèi)存的高速度保證系統(tǒng)的數(shù)據(jù)訪問(wèn)性能。也就是說(shuō),可用內(nèi)存越小,內(nèi)存的利用率就更高,其中的數(shù)據(jù)就越多,數(shù)據(jù)訪問(wèn)的命中率就越高,系統(tǒng)響應(yīng)也就越快。如果還有人和你說(shuō)手機(jī)用不了4GB這么的大內(nèi)存,那只是廠商的噱頭而已,你完全可以無(wú)視他,再用事實(shí)教育之。
當(dāng)然,即便如此,我們也可能還會(huì)面臨更多的問(wèn)題:當(dāng)打開的應(yīng)用越來(lái)越多,占用的內(nèi)存總會(huì)爆滿的,那時(shí)又當(dāng)如何?
該出手時(shí)就出手,Android有著優(yōu)秀的內(nèi)存回收機(jī)制
實(shí)際上,作為Android的開發(fā)語(yǔ)言Java沒(méi)有提供任何操作來(lái)釋放內(nèi)存(這也是與iOS很大的不同點(diǎn)),它是通過(guò)系統(tǒng)的內(nèi)存回收機(jī)制來(lái)進(jìn)行管理。Android使用了一個(gè)名為L(zhǎng)ow Memory Killer(LMK)的機(jī)制來(lái)管理內(nèi)存,當(dāng)內(nèi)存出現(xiàn)不足時(shí),LMK就開始揮舞“屠刀”殺掉一些進(jìn)程,那么就帶來(lái)了一個(gè)問(wèn)題:哪些進(jìn)程會(huì)被系統(tǒng)選中?
在這里,為了將該進(jìn)程選擇機(jī)制解釋清楚,我們不妨在此多費(fèi)點(diǎn)筆墨。Android會(huì)對(duì)進(jìn)程的重要性進(jìn)行評(píng)估,以oom_adj來(lái)表示,oom_adj的值越小,則重要性越高;oom_adj的值越大,該進(jìn)程被系統(tǒng)選中并殺掉的可能性則越高;當(dāng)oom_adj值為0,這意味著它永遠(yuǎn)不會(huì)被系統(tǒng)終止。
針對(duì)這一機(jī)制,Android有一套自己獨(dú)特的進(jìn)程管理系統(tǒng),比如可以設(shè)定“當(dāng)內(nèi)存小于22MB時(shí),結(jié)束oom_adj大于14的進(jìn)程”這樣的策略,可以看到oom_adj非常重要,關(guān)乎進(jìn)程的死生命運(yùn)。
如上表描述的那樣,在默認(rèn)策略中,當(dāng)內(nèi)存低于24MB(6144(4K)時(shí),LMK就會(huì)殺掉所有oom_adj為15的進(jìn)程(即空進(jìn)程)。當(dāng)然,這個(gè)警戒值可以人為修改,只是一般情況下也沒(méi)必要去改變它。為了更好的評(píng)估進(jìn)程的重要性,Android將進(jìn)程分為六類,如下所述:
前臺(tái)進(jìn)程(foreground):oom_adj=0,指正在當(dāng)前屏幕上顯示的進(jìn)程和一些系統(tǒng)進(jìn)程,一旦你回到主界面 或切換到其它程序,當(dāng)前進(jìn)程變?yōu)殡[藏進(jìn)程,前臺(tái)進(jìn)程是不會(huì)殺掉的;
可見(jiàn)進(jìn)程(visible):oom_adj=1,可見(jiàn)進(jìn)程雖然不在前臺(tái),但依然可見(jiàn),如widget、輸入法等,這部分進(jìn)程也非常重要,基本上不可能被殺掉;
次要服務(wù)(secondary server):oom_adj=2,目前正在運(yùn)行的一些服務(wù),如下載、播放音樂(lè),它們雖然屬于次要服務(wù),但與系統(tǒng)息息相關(guān),一般也不會(huì)被殺掉;
隱藏進(jìn)程(hidden):oom_adj=7,這個(gè)很容易理解,當(dāng)應(yīng)用從前臺(tái)轉(zhuǎn)入到后臺(tái)后,也就成為隱藏進(jìn)程了,通常一鍵清理內(nèi)存就是清掉這些隱藏進(jìn)程;
內(nèi)容提供者(content provider):oom_adj=14,沒(méi)有程序?qū)嶓w,只提供內(nèi)容供別的程序去用的,比如日歷供應(yīng)節(jié)點(diǎn),顯然這類進(jìn)程最有可能被先殺掉;
空進(jìn)程(empty):oom_adj=15,有些程序在程序退出后,依然會(huì)在進(jìn)程中駐留一個(gè)空進(jìn)程,這個(gè)進(jìn)程里沒(méi)有任何數(shù)據(jù)在運(yùn)行,作用往往是提高該程序下次的啟動(dòng)速度或者記錄程序的一些歷史信息,這類進(jìn)程無(wú)疑是要最先被殺掉的。
Android的內(nèi)存管理機(jī)制非常適合嵌入式系統(tǒng),能充分發(fā)揮出硬件的潛力,當(dāng)內(nèi)存越大,它的優(yōu)勢(shì)就越明顯。
Android手機(jī)需要清內(nèi)存嗎?需要嗎?
回到要討論的話題,Android手機(jī)需要清內(nèi)存嗎?結(jié)合前面的介紹,我們的結(jié)論是再明顯不過(guò)了:完全不需要!其實(shí),這個(gè)結(jié)論也適用iPhone手機(jī),只不過(guò)iOS在內(nèi)存管理方面更為激進(jìn)。
可見(jiàn),我們完全不用糾結(jié)Android手機(jī)上的可用內(nèi)存大小,也不需要去一鍵清理內(nèi)存,這樣做有時(shí)可能還會(huì)適得其反,尤其是在手機(jī)內(nèi)存2GB起步3GB成主流的今天,我們會(huì)很享受Android的內(nèi)存管理機(jī)制。其實(shí),目前主流硬件規(guī)格的Android手機(jī)系統(tǒng)在運(yùn)行流暢度上都有著很好的表現(xiàn),基本上能與iOS一決高下,而在Android 5.1.1以上版本的系統(tǒng)中體會(huì)到如絲般順滑的使用感受也都是可以期待的,至于為什么很多手機(jī)仍然會(huì)出現(xiàn)“越用越卡”的情況,這個(gè)問(wèn)題就有點(diǎn)復(fù)雜了,涉及了多個(gè)方面,我們就先不在此展開,留至下一期繼續(xù)討論。