Android內(nèi)存管理其實(shí)是一個(gè)非常復(fù)雜和龐大的話題倒戏,Android系統(tǒng)的內(nèi)存管理機(jī)制有:Lowmemory Killer機(jī)制捏鱼,Ashmem機(jī)制缅叠,Pmem/Ion機(jī)制及Native內(nèi)存管理和Dalvik內(nèi)存管理和Jvm垃圾回收機(jī)制厉颤。我們今天只講Lowmemory Killer機(jī)制鼎文。
Android系統(tǒng)是基于Linux 內(nèi)核開發(fā)的開源操作系統(tǒng),而Linux系統(tǒng)的內(nèi)存管理有其獨(dú)特的動(dòng)態(tài)存儲(chǔ)管理機(jī)制贬墩。不過Android系統(tǒng)對(duì)Linux的內(nèi)存管理機(jī)制進(jìn)行了優(yōu)化榴嗅,Linux系統(tǒng)會(huì)在進(jìn)程活動(dòng)停止后就結(jié)束該進(jìn)程,而Android把這些進(jìn)程都保留在內(nèi)存中陶舞,直到系統(tǒng)需要更多內(nèi)存為止嗽测。Android是一個(gè)多任務(wù)系統(tǒng),也就是說可以同時(shí)運(yùn)行多個(gè)程序肿孵,一般來說唠粥,啟動(dòng)運(yùn)行一個(gè)程序是有一定的時(shí)間開銷的,因此為了加快運(yùn)行速度停做,當(dāng)你退出一個(gè)程序時(shí)晤愧,Android并不會(huì)立即殺掉它,這樣下次再運(yùn)行該程序時(shí)蛉腌,可以很快的啟動(dòng)官份。隨著系統(tǒng)中保留的程序越來越多只厘,內(nèi)存肯定會(huì)出現(xiàn)不足,這個(gè)時(shí)候Android系統(tǒng)開始揮舞屠刀殺進(jìn)程舅巷。Android系統(tǒng)中殺進(jìn)程的這個(gè)劊子手被稱作"Lowmemory Killer"懈凹,也就是我們要探討的這貨,它是在Linux內(nèi)核中實(shí)現(xiàn)的∏男常現(xiàn)在我們已經(jīng)知道殺手是誰了介评,那么問題來了,殺誰爬舰?
我們已經(jīng)清楚內(nèi)存不足時(shí)Lowmemory Killer會(huì)殺掉某些進(jìn)程们陆,那我們來看一下Android系統(tǒng)都有哪些進(jìn)程(按被殺死的可能性從低到高排列)。
1:前臺(tái)進(jìn)程(Forground App)
目前正在屏幕上顯示的進(jìn)程和一些系統(tǒng)進(jìn)程情屹,幾乎沒有被殺死的可能性坪仇,代表進(jìn)程:你目前正在讀這篇文章所用的應(yīng)用。
2:可見進(jìn)程(Visble App)
這部分進(jìn)程雖然不在前臺(tái)垃你,但與我們的使用也密切相關(guān)椅文,我們也不希望它們被終止,通常情況下不會(huì)被殺死惜颇,代表進(jìn)程:輸入法皆刺。
3:次要服務(wù)(Secondary Server)
這部分服務(wù)雖然屬于次要服務(wù),但很一些系統(tǒng)功能依然息息相關(guān)凌摄,我們時(shí)常需要用到它們羡蛾,所以也太希望他們被終止。代表進(jìn)程:聯(lián)系人內(nèi)部存儲(chǔ)锨亏。
4:后臺(tái)進(jìn)程(Hidden App)
就是我們通常意義上理解的啟動(dòng)后被切換到后臺(tái)的進(jìn)程痴怨,如瀏覽器,閱讀器等器予。當(dāng)程序顯示在屏幕上時(shí)浪藻,他所運(yùn)行的進(jìn)程即為前臺(tái)進(jìn)程(Foreground),一旦我們按Home返回主界面(注意是按Home乾翔,不是按Back)爱葵,程序就駐留在后臺(tái),成為后臺(tái)進(jìn)程(Background)末融。
5:內(nèi)容提供者(Content Provider)
沒有程序?qū)嶓w钧惧,僅提供內(nèi)容供別的程序去用的暇韧,比如日歷供應(yīng)節(jié)點(diǎn)勾习,在終止進(jìn)程時(shí),這類程序應(yīng)該有較高的優(yōu)先權(quán)懈玻。
6:空進(jìn)程(Empty App)
在程序退出后巧婶,依然會(huì)在進(jìn)程中駐留一個(gè)空進(jìn)程乾颁,這個(gè)進(jìn)程里沒有任何數(shù)據(jù)在運(yùn)行,作用往往是提高該程序下次的啟動(dòng)速度或者記錄程序的一些歷史信息艺栈。這部分進(jìn)程無疑是應(yīng)該最先被終止的英岭。
Android系統(tǒng)共有六類進(jìn)程,當(dāng)內(nèi)存發(fā)生不足時(shí)最先殺死的是空進(jìn)程湿右,如果殺死空進(jìn)程后依然無法保證足夠的Ram,屠刀將揮向內(nèi)容提供者诅妹,再不夠殺后臺(tái)進(jìn)程,以此類推毅人。當(dāng)然前臺(tái)進(jìn)程吭狡,可見進(jìn)程,次要服務(wù)這三個(gè)被殺死的肯能性很小丈莺。我們已經(jīng)搞清楚了殺誰的問題划煮,那么問題又來了,什么時(shí)候殺缔俄?
你可能會(huì)說就是Ram不足的時(shí)候殺唄弛秋,那到底什么時(shí)候視為Ram不足呢。Android系統(tǒng)有一個(gè)規(guī)則來回收內(nèi)存俐载,進(jìn)行內(nèi)存調(diào)度有個(gè)閥值蟹略,只有低于這個(gè)閥值系統(tǒng)才會(huì)按一個(gè)順序來關(guān)閉系統(tǒng)認(rèn)為最不重要的進(jìn)程,釋放Ram空間遏佣。為了更有說服力科乎,我們干脆來看看這個(gè)閥值到底是多少,不過要先獲取手機(jī)的Root權(quán)限贼急,打開你的Android手機(jī)Sys/Module/Lowmemorykiller/Parameters/Minfree的這個(gè)目錄文件茅茂,閥值就被寫在這里。以我手里這臺(tái)Nexus7為例,我得到一串?dāng)?shù)字:5418太抓,7224空闲,14448,36120走敌,45150碴倾,54180,這串?dāng)?shù)字是什么意思掉丽,我猜應(yīng)該是摩斯密碼吧跌榔,開個(gè)玩笑,當(dāng)然不是捶障,這六個(gè)數(shù)字分別代表了6種進(jìn)程(對(duì)應(yīng)上文的順序)可能被殺死的剩余內(nèi)存最小閥值僧须,這串?dāng)?shù)字的單位是Page,1Page=4Kb项炼,我們做一下轉(zhuǎn)換就54180Page=211Mb, 就是說當(dāng)運(yùn)行內(nèi)存小于211Mb的時(shí)候担平,Lowmemory Killer就要?dú)⑺繣mpty App示绊。Content Provider:45150Page=176Mb,當(dāng)運(yùn)行內(nèi)存小于176Mb的時(shí)候暂论,Lowmemory Killer不光要?dú)⑺繣mpty App面褐,還要?dú)⑺繡ontent Provider。Hidden App:141Mb取胎,Secondary Server: 56Mb展哭,Visible App:28Mb,F(xiàn)orgound App:21Mb闻蛀,以此類推摄杂。
我們可以獲取手機(jī)系統(tǒng)的內(nèi)存調(diào)度閥值,那么用戶可不可以更改這個(gè)閥值循榆?當(dāng)然可以析恢,Android最大的魅力就在于能滿足你的無限幻想,只要你想做秧饮,總是有辦法的映挂。打開Minfree文件,如果你是個(gè)Android骨灰級(jí)玩家盗尸,你甚至可以手動(dòng)修改文件內(nèi)的閥值大小柑船,高級(jí)玩家也可以借助工具自行修改,初級(jí)玩家還是洗洗睡了吧泼各。修改閥值有什么作用呢鞍时,這就好比一臺(tái)車,你可以把避震調(diào)教的硬一點(diǎn)扣蜻,來獲得更精準(zhǔn)的操控樂趣逆巍;你也可以把避震調(diào)教的軟一點(diǎn),來獲得更舒適的駕控體驗(yàn)莽使。再說回手機(jī)锐极,我們可以調(diào)大閥值,讓系統(tǒng)一直運(yùn)行在一個(gè)充裕的內(nèi)存環(huán)境中芳肌,當(dāng)然這個(gè)時(shí)候Lowmemory Killer可能要頻繁工作灵再,也會(huì)帶來相對(duì)應(yīng)的性能損耗。我們也可以調(diào)小閥值亿笤,讓系統(tǒng)緩存更多的進(jìn)程翎迁,這樣下次打開應(yīng)用的時(shí)候會(huì)更迅速,這里的缺點(diǎn)就是當(dāng)可用內(nèi)存比較少的時(shí)候打開一個(gè)大型應(yīng)用净薛,Lowmemory Killer會(huì)比較忙汪榔,用戶的直觀感覺就是有點(diǎn)卡。閥值設(shè)成多大罕拂,關(guān)鍵是找到一個(gè)適合自己的平衡點(diǎn)揍异。手機(jī)出廠系統(tǒng)會(huì)有一串默認(rèn)閥值全陨,這串閥值應(yīng)該是手機(jī)廠商調(diào)教過的一個(gè)比較舒適的平衡點(diǎn)了爆班,一般情況下不建議用戶自己手動(dòng)修改衷掷。
最后再說一個(gè)問題,如何正確的使用Android手機(jī)柿菩?如果你是一個(gè)Android 用戶戚嗅,你肯定經(jīng)常手動(dòng)殺后臺(tái)應(yīng)用,因?yàn)槟阌X得他們會(huì)耗電枢舶,但事實(shí)上并沒有懦胞,后臺(tái)應(yīng)用只是在內(nèi)存中保存了一個(gè)運(yùn)行狀態(tài),他們什么事都沒干凉泄,當(dāng)然也不會(huì)耗電(流氓應(yīng)用和常駐內(nèi)存的應(yīng)用除外)躏尉。 你又會(huì)說即便不耗電,也占內(nèi)存后众,占內(nèi)存又有何妨胀糜,系統(tǒng)有自己的內(nèi)存管理方式,你的手機(jī)系統(tǒng)里有個(gè)殺手 ?----- ?Lowmemory Killer蒂誉,這種事還是交給它來做吧教藻。。右锨。