安卓Android的記憶體管理原理嘮叨

2021-07-25 11:00:32 字數 2257 閱讀 9831

android採取了一種有別於linux的程序管理策略,有別於linux的在程序活動停止後就結束該程序,android把這些程序都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的程序通常情況下不會影響整體系統的執行速度,並且當使用者再次啟用這些程序時,提公升了程序的啟動速度。

那android什麼時候結束程序?結束哪個程序呢?之前普遍的認識是android是依據乙個名為lru(last recently used 最近使用過的程式)列表,將程式進行排序,並結束最早的程序。

其實安卓的記憶體管理機制是這樣的,如下:

1

1.系統會對程序的重要性進行評估,並將重要性以「oom_adj」這個數值表示出來,賦予各個程序;(系統會根據「oom_adj」來判斷需要結束哪些程序,一般來說,「oom_adj」的值越大,該程序被系統選中終止的可能就越高) 2

2.前台程式的「oom_adj」值為0,這意味著它不會被系統終止,一旦它不可訪問後,會獲得個更高的「oom_adj」,我們推測「oom_adj」的值是根據軟體在lru列表中的位置所決定的; 3

3.android不同於linux,有一套自己獨特的程序管理模組,這個模組有更強的可定製性,可根據「oom_adj」值的範圍來決定程序管理策略,比如可以設定「當記憶體小於x時,結束「oom_adj」大於y的程序」。這給了程序管理指令碼的編寫以更多的選擇。

end

android將程序分為六大類:

前台程序(foreground):目前正在螢幕上顯示的程序和一些系統程序。舉例來說,dialer storage,google search等系統程序就是前台程序;再舉例來說,當你執行乙個程式,如瀏覽器,當瀏覽器介面在前台顯示時,瀏覽器屬於前台程序(foreground),但一旦你按home回到主介面,瀏覽器就變成了後台程式(background)。我們最不希望終止的程序就是前台程序。

可見程序(visible):可見程序是一些不再前台,但使用者依然可見的程序,舉個例來說:widget、輸入法等,都屬於visible。這部分程序雖然不在前台,但與我們的使用也密切相關,我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)

次要服務(secondary server):目前正在執行的一些服務(主要服務,如撥號等,是不可能被程序管理終止的,故這裡只談次要服務),舉例來說:谷歌企業套件,gmail內部儲存,聯絡人內部儲存等。這部分服務雖然屬於次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止

.後台程序(hidden):雖然作者用了hidden這個詞,但實際即是後台程序(background),就是我們通常意義上理解的啟動後被切換到後台的程序,如瀏覽器,閱讀器等。當程式顯示在螢幕上時,他所執行的程序即為前台程序(foreground),一旦我們按home返回主介面(注意是按home,不是按back),程式就駐留在後台,成為後台程序(background)。後台程序的管理策略有多種:有較為積極的方式,一旦程式到達後台立即終止,這種方式會提高程式的執行速度,但無法加速程式的再次啟動;也有較消極的方式,盡可能多的保留後台程式,雖然可能會影響到單個程式的執行速度,但在再次啟動已啟動的程式時,速度會有所提公升。這裡就需要使用者根據自己的使用習慣找到乙個平衡點

內容**節點(content provider):沒有程式實體,進提供內容供別的程式去用的,比如日曆**節點,郵件**節點等。在終止程序時,這類程式應該有較高的優先權

空程序(empty):沒有任何東西在內執行的程序,有些程式,比如bte,在程式退出後,依然會在程序中駐留乙個空程序,這個程序裡沒有任何資料在執行,作用往往是提高該程式下次的啟動速度或者記錄程式的一些歷史資訊。這部分程序無疑是應該最先終止的。

簡單來說,就是選擇退出程式時,並不是完全退出程式,該程式仍然會在後台駐留乙個程序,以便下次更快的開啟。那什麼時候完全關閉該程式呢?這取決於該程式的型別(就是上面講的那幾個型別)。系統會給每個型別的程式乙個記憶體值閾(閥門),也就是說當執行記憶體低於某個值時,系統會自動按照開啟的先後順序來關閉該型別的程式。例如,當運存小於24mb時,系統才會自動關閉空程序這一型別的程式,釋放出更多的記憶體來供新程式使用,已保證新開程式的正常執行。

end

總結1綜上所述,我們不難看出,很多時候我們沒必要過多的區關注系統的空閒記憶體(ram)是多少,也沒必要特意的去殺掉後台程式,因為系統會自動分配記憶體,以保證新程式的執行,特殊情況除外,比如你馬上就要開乙個非常大的遊戲,需要更多的記憶體,這個時候就可以手動殺掉一些後台程式,以保證遊戲的流暢。

作為參考:

安卓Android的記憶體管理原理解析

android採取了一種有別於linux的程序管理策略,有別於linux的在程序活動停止後就結束該程序,android把這些程序都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的程序通常情況下不會影響整體系統的執行速度,並且當使用者再次啟用這些程序時,提公升了程序的啟動速度。那and...

安卓學習日記 記憶體管理技巧

如果應用程式當中需要使用service來執行後台任務的話,請一定要注意只有當任務正在執行的時候才應該讓service執行起來。另外,當任務執行完之後去停止service的時候,要小心service停止失敗導致記憶體洩漏的情況。當我們啟動乙個service時,系統會傾向於將這個service所依賴的程...

安卓記憶體的統計

ddr totalmem 預留記憶體 核心 段 啟動階段的列印中可以看到 totalmem free used lost 這三個資料在dumpsys meminfo 中可以看到 free pss cached kernel cached free proc meminfo中的free used ps...