前言:Android系統(tǒng)是基于Linux內(nèi)核開發(fā)的操作系統(tǒng),而Linux系統(tǒng)有其獨到的內(nèi)存管理機(jī)制,會在進(jìn)程活動停止后結(jié)束該進(jìn)程。Android在此基礎(chǔ)上優(yōu)化了內(nèi)存管理,會把進(jìn)程都保存在內(nèi)存中粘我,直到系統(tǒng)需要更多內(nèi)存為止,釋放部分進(jìn)程痹换。這些被保存在內(nèi)存中的進(jìn)程涂滴,并不會影響系統(tǒng)的運行速度,相反晴音,在重新打開這些進(jìn)程時柔纵,會提升進(jìn)程啟動速度
Android 內(nèi)存管理
分配機(jī)制
Android為每個進(jìn)程分配內(nèi)存的時候,采用了彈性的分配方式锤躁,也就是剛開始并不會一下分配很多內(nèi)存給每個進(jìn)程搁料,而是給每一個進(jìn)程分配一個“夠用”的量。這個量是根據(jù)每一個設(shè)備實際的物理內(nèi)存大小來決定的系羞。隨著應(yīng)用的運行郭计,可能會發(fā)現(xiàn)當(dāng)前的內(nèi)存可能不夠使用了,這時候Android又會為每個進(jìn)程分配一些額外的內(nèi)存大小椒振。但是這些額外的大小并不是隨意的昭伸,也是有限度的,系統(tǒng)不可能為每一個App分配無限大小的內(nèi)除澎迎。
Android系統(tǒng)的宗旨是最大限度的讓更多的進(jìn)程存活在內(nèi)存中庐杨,因為這樣的話,下一次用戶再啟動應(yīng)用夹供,不需要重新創(chuàng)建進(jìn)程灵份,只需要恢復(fù)已有的進(jìn)程就可以了,減少了應(yīng)用的啟動時間哮洽,提高了用戶體驗填渠。
回收機(jī)制
Android 的每個應(yīng)用程序都會使用一個專有的Dalvik(ART4.4以上)虛擬機(jī)實例來運行,它是由Zygote服務(wù)進(jìn)程演變過來的,每個應(yīng)用程序都在獨立的進(jìn)程中運行氛什。好處如下:
- 如果程序在運行過程中出現(xiàn)了內(nèi)存泄漏的問題莺葫,僅僅會使得自己的進(jìn)程被殺掉,而不會影響其他進(jìn)程
- Android為不同類型的進(jìn)程分配了不同的內(nèi)存使用上限枪眉,如果應(yīng)用進(jìn)程使用的內(nèi)存超過了這個上限徙融, 則會被系統(tǒng)視為內(nèi)存泄漏,從而被殺掉瑰谜。
- Android會為每個應(yīng)用程序分配一個單獨的LINUX用戶。Android會盡量保留一個正在運行進(jìn)程树绩,只在內(nèi)存資源出現(xiàn)不足時萨脑,Android會嘗試停止一些進(jìn)程從而釋放足夠的資源給其他新的進(jìn)程使用, 也能保證用戶正在訪問的當(dāng)前進(jìn)程有足夠的資源去及時地響應(yīng)用戶的事件饺饭。Android會根據(jù)進(jìn)程中運行的組件類別以及組件的狀態(tài)來判斷該進(jìn)程的重要性渤早,Android會首先停止那些不重要的進(jìn)程。按照重要性從高到低一共有五個級別就是我們常說的:前臺進(jìn)程瘫俊、可見進(jìn)程鹊杖、服務(wù)進(jìn)程、后臺進(jìn)程扛芽、空進(jìn)程骂蓖。
簡單說,
- 每個應(yīng)用程序都是一個獨立的進(jìn)程川尖,互不影響登下,進(jìn)程死掉不會導(dǎo)致系統(tǒng)崩潰、重啟叮喳。
- 每個應(yīng)用程序都有內(nèi)存上限被芳,接近、超過都會被kill
Android進(jìn)程種類
增加了桌面進(jìn)程和內(nèi)容供應(yīng)節(jié)點
1. 前臺進(jìn)程(foreground)
目前正在屏幕上顯示的進(jìn)程和一些系統(tǒng)進(jìn)程馍悟。舉例來說畔濒,Dialer,Storage锣咒,Google Search等系統(tǒng)進(jìn)程就是前臺進(jìn)程侵状;再舉例來說,當(dāng)你運行一個程序毅整,如瀏覽器壹将,當(dāng)瀏覽器界面在前臺顯示時,瀏覽器屬于前臺進(jìn)程(foreground)毛嫉,但一旦你按home回到主界面诽俯,瀏覽器就變成了后臺程序(background)。我們最不希望終止的進(jìn)程就是前臺進(jìn)程。
2. 可見進(jìn)程(visible)
可見進(jìn)程是一些不再前臺暴区,但用戶依然可見的進(jìn)程闯团,舉個例來說:widget、輸入法等仙粱,都屬于visible房交。這部分進(jìn)程雖然不在前臺,但與我們的使用也密切相關(guān)伐割,我們也不希望它們被終止(你肯定不希望時鐘候味、天氣,新聞等widget被終止隔心,那它們將無法同步白群,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)
3. 桌面進(jìn)程(home app)
即launcher硬霍,保證在多任務(wù)切換之后帜慢,可以快速返回到home界面而不需重新加載launcher
4. 次要服務(wù)(secondary server)
目前正在運行的一些服務(wù)(主要服務(wù),如撥號等唯卖,是不可能被進(jìn)程管理終止的粱玲,故這里只談次要服務(wù)),舉例來說:谷歌企業(yè)套件拜轨,Gmail內(nèi)部存儲抽减,聯(lián)系人內(nèi)部存儲等。這部分服務(wù)雖然屬于次要服務(wù)橄碾,但很一些系統(tǒng)功能依然息息相關(guān)胯甩,我們時常需要用到它們,所以也太希望他們被終止
5. 后臺進(jìn)程(hidden)
即是后臺進(jìn)程(background)堪嫂,就是我們通常意義上理解的啟動后被切換到后臺的進(jìn)程偎箫,如瀏覽器,閱讀器等皆串。當(dāng)程序顯示在屏幕上時淹办,他所運行的進(jìn)程即為前臺進(jìn)程(foreground),一旦我們按home返回主界面(注意是按home恶复,不是按back)怜森,程序就駐留在后臺,成為后臺進(jìn)程(background)谤牡。后臺進(jìn)程的管理策略有多種:有較為積極的方式副硅,一旦程序到達(dá)后臺立即終止,這種方式會提高程序的運行速度翅萤,但無法加速程序的再次啟動恐疲;也有較消極的方式,盡可能多的保留后臺程序,雖然可能會影響到單個程序的運行速度培己,但在再次啟動已啟動的程序時碳蛋,速度會有所提升。這里就需要用戶根據(jù)自己的使用習(xí)慣找到一個平衡點
6. 內(nèi)容供應(yīng)節(jié)點(content provider)
沒有程序?qū)嶓w省咨,進(jìn)提供內(nèi)容供別的程序去用的肃弟,比如日歷供應(yīng)節(jié)點,郵件供應(yīng)節(jié)點等零蓉。在終止進(jìn)程時笤受,這類程序應(yīng)該有較高的優(yōu)先權(quán)
7. 空進(jìn)程(empty)
沒有任何東西在內(nèi)運行的進(jìn)程,有些程序敌蜂,比如BTE箩兽,在程序退出后,依然會在進(jìn)程中駐留一個空進(jìn)程紊册,這個進(jìn)程里沒有任何數(shù)據(jù)在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息快耿。這部分進(jìn)程無疑是應(yīng)該最先終止的囊陡。