Android 內(nèi)存管理機(jī)制

前言:Android系統(tǒng)是基于Linux內(nèi)核開發(fā)的操作系統(tǒng),而Linux系統(tǒng)有其獨(dú)到的內(nèi)存管理機(jī)制,會(huì)在進(jìn)程活動(dòng)停止后結(jié)束該進(jìn)程。Android在此基礎(chǔ)上優(yōu)化了內(nèi)存管理,會(huì)把進(jìn)程都保存在內(nèi)存中,直到系統(tǒng)需要更多內(nèi)存為止,釋放部分進(jìn)程。這些被保存在內(nèi)存中的進(jìn)程,并不會(huì)影響系統(tǒng)的運(yùn)行速度,相反,在重新打開這些進(jìn)程時(shí),會(huì)提升進(jìn)程啟動(dòng)速度

Android 內(nèi)存管理

分配機(jī)制

Android為每個(gè)進(jìn)程分配內(nèi)存的時(shí)候,采用了彈性的分配方式,也就是剛開始并不會(huì)一下分配很多內(nèi)存給每個(gè)進(jìn)程,而是給每一個(gè)進(jìn)程分配一個(gè)“夠用”的量。這個(gè)量是根據(jù)每一個(gè)設(shè)備實(shí)際的物理內(nèi)存大小來決定的。隨著應(yīng)用的運(yùn)行,可能會(huì)發(fā)現(xiàn)當(dāng)前的內(nèi)存可能不夠使用了,這時(shí)候Android又會(huì)為每個(gè)進(jìn)程分配一些額外的內(nèi)存大小。但是這些額外的大小并不是隨意的,也是有限度的,系統(tǒng)不可能為每一個(gè)App分配無限大小的內(nèi)除。

Android系統(tǒng)的宗旨是最大限度的讓更多的進(jìn)程存活在內(nèi)存中,因?yàn)檫@樣的話,下一次用戶再啟動(dòng)應(yīng)用,不需要重新創(chuàng)建進(jìn)程,只需要恢復(fù)已有的進(jìn)程就可以了,減少了應(yīng)用的啟動(dòng)時(shí)間,提高了用戶體驗(yàn)。

回收機(jī)制

Android 的每個(gè)應(yīng)用程序都會(huì)使用一個(gè)專有的Dalvik(ART4.4以上)虛擬機(jī)實(shí)例來運(yùn)行,它是由Zygote服務(wù)進(jìn)程演變過來的,每個(gè)應(yīng)用程序都在獨(dú)立的進(jìn)程中運(yùn)行。好處如下:

  • 如果程序在運(yùn)行過程中出現(xiàn)了內(nèi)存泄漏的問題,僅僅會(huì)使得自己的進(jìn)程被殺掉,而不會(huì)影響其他進(jìn)程
  • Android為不同類型的進(jìn)程分配了不同的內(nèi)存使用上限,如果應(yīng)用進(jìn)程使用的內(nèi)存超過了這個(gè)上限, 則會(huì)被系統(tǒng)視為內(nèi)存泄漏,從而被殺掉。
  • Android會(huì)為每個(gè)應(yīng)用程序分配一個(gè)單獨(dú)的LINUX用戶。Android會(huì)盡量保留一個(gè)正在運(yùn)行進(jìn)程,只在內(nèi)存資源出現(xiàn)不足時(shí),Android會(huì)嘗試停止一些進(jìn)程從而釋放足夠的資源給其他新的進(jìn)程使用, 也能保證用戶正在訪問的當(dāng)前進(jìn)程有足夠的資源去及時(shí)地響應(yīng)用戶的事件。Android會(huì)根據(jù)進(jìn)程中運(yùn)行的組件類別以及組件的狀態(tài)來判斷該進(jìn)程的重要性,Android會(huì)首先停止那些不重要的進(jìn)程。按照重要性從高到低一共有五個(gè)級(jí)別就是我們常說的:前臺(tái)進(jìn)程、可見進(jìn)程、服務(wù)進(jìn)程、后臺(tái)進(jìn)程、空進(jìn)程。

簡(jiǎn)單說,

  • 每個(gè)應(yīng)用程序都是一個(gè)獨(dú)立的進(jìn)程,互不影響,進(jìn)程死掉不會(huì)導(dǎo)致系統(tǒng)崩潰、重啟。
  • 每個(gè)應(yīng)用程序都有內(nèi)存上限,接近、超過都會(huì)被kill

Android進(jìn)程種類

增加了桌面進(jìn)程和內(nèi)容供應(yīng)節(jié)點(diǎn)
1. 前臺(tái)進(jìn)程(foreground)
目前正在屏幕上顯示的進(jìn)程和一些系統(tǒng)進(jìn)程。舉例來說,Dialer,Storage,Google Search等系統(tǒng)進(jìn)程就是前臺(tái)進(jìn)程;再舉例來說,當(dāng)你運(yùn)行一個(gè)程序,如瀏覽器,當(dāng)瀏覽器界面在前臺(tái)顯示時(shí),瀏覽器屬于前臺(tái)進(jìn)程(foreground),但一旦你按home回到主界面,瀏覽器就變成了后臺(tái)程序(background)。我們最不希望終止的進(jìn)程就是前臺(tái)進(jìn)程。
2. 可見進(jìn)程(visible)
可見進(jìn)程是一些不再前臺(tái),但用戶依然可見的進(jìn)程,舉個(gè)例來說:widget、輸入法等,都屬于visible。這部分進(jìn)程雖然不在前臺(tái),但與我們的使用也密切相關(guān),我們也不希望它們被終止(你肯定不希望時(shí)鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時(shí)都需要重新啟動(dòng)輸入法)
3. 桌面進(jìn)程(home app)
即launcher,保證在多任務(wù)切換之后,可以快速返回到home界面而不需重新加載launcher
4. 次要服務(wù)(secondary server)
目前正在運(yùn)行的一些服務(wù)(主要服務(wù),如撥號(hào)等,是不可能被進(jìn)程管理終止的,故這里只談次要服務(wù)),舉例來說:谷歌企業(yè)套件,Gmail內(nèi)部存儲(chǔ),聯(lián)系人內(nèi)部存儲(chǔ)等。這部分服務(wù)雖然屬于次要服務(wù),但很一些系統(tǒng)功能依然息息相關(guān),我們時(shí)常需要用到它們,所以也太希望他們被終止
5. 后臺(tái)進(jìn)程(hidden)
即是后臺(tái)進(jìn)程(background),就是我們通常意義上理解的啟動(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)。后臺(tái)進(jìn)程的管理策略有多種:有較為積極的方式,一旦程序到達(dá)后臺(tái)立即終止,這種方式會(huì)提高程序的運(yùn)行速度,但無法加速程序的再次啟動(dòng);也有較消極的方式,盡可能多的保留后臺(tái)程序,雖然可能會(huì)影響到單個(gè)程序的運(yùn)行速度,但在再次啟動(dòng)已啟動(dòng)的程序時(shí),速度會(huì)有所提升。這里就需要用戶根據(jù)自己的使用習(xí)慣找到一個(gè)平衡點(diǎn)
6. 內(nèi)容供應(yīng)節(jié)點(diǎn)(content provider)
沒有程序?qū)嶓w,進(jìn)提供內(nèi)容供別的程序去用的,比如日歷供應(yīng)節(jié)點(diǎn),郵件供應(yīng)節(jié)點(diǎn)等。在終止進(jìn)程時(shí),這類程序應(yīng)該有較高的優(yōu)先權(quán)
7. 空進(jìn)程(empty)
沒有任何東西在內(nèi)運(yùn)行的進(jìn)程,有些程序,比如BTE,在程序退出后,依然會(huì)在進(jìn)程中駐留一個(gè)空進(jìn)程,這個(gè)進(jìn)程里沒有任何數(shù)據(jù)在運(yùn)行,作用往往是提高該程序下次的啟動(dòng)速度或者記錄程序的一些歷史信息。這部分進(jìn)程無疑是應(yīng)該最先終止的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容