無(wú)論手機(jī)的物理內(nèi)存有多大,Android都能將其充分利用,將需要用到(包括之前用過(guò)的)的數(shù)據(jù)從硬盤(pán)讀入到內(nèi)存,利用內(nèi)存的高速保證系統(tǒng)的數(shù)據(jù)訪問(wèn)性能,也就是說(shuō),可用內(nèi)存越小,內(nèi)存的利用率就更高,其中的數(shù)據(jù)就越多,數(shù)據(jù)訪問(wèn)的命中率就越高,系統(tǒng)也就越快。如果還有人和你說(shuō)手機(jī)用不了4GB這么的大內(nèi)存,那只是廠商的噱頭而已,你完全可以鄙視再教育之。
你可能會(huì)問(wèn),當(dāng)打開(kāi)的應(yīng)用越來(lái)越多,占用的內(nèi)存總會(huì)爆滿的,那怎么辦呢?
該出手時(shí)就出手,Android有著優(yōu)秀的內(nèi)存回收機(jī)制
在上面舉例中,3GB內(nèi)存的手機(jī)只有81MB的可用內(nèi)存了,如果此時(shí)打開(kāi)需要256MB內(nèi)存的“騰訊視頻”,會(huì)提示“內(nèi)存不足”嗎?答案是不會(huì)的。
當(dāng)內(nèi)存不足時(shí),內(nèi)存回收機(jī)制就開(kāi)始起作用了
實(shí)際上,作為Android的開(kāi)發(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就開(kāi)始揮舞屠刀殺掉一些進(jìn)程,那么問(wèn)題來(lái)了,殺誰(shuí)?
說(shuō)到這兒,必須多費(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)終止。
Android有一套自己獨(dú)特的進(jìn)程管理,比如可以設(shè)定“當(dāng)內(nèi)存小于22M時(shí),結(jié)束oom_adj大于14的進(jìn)程”這樣的策略,可以看到oom_adj非常重要,關(guān)乎進(jìn)程的死生命運(yùn)。