Android記憶體管理機制

2021-09-19 19:19:28 字數 2290 閱讀 4322

按home鍵,看起來似乎是退出了,但是其實這個軟體並沒有被關閉,而是轉為了後台程式(指一般的軟體,不討論特別種類的軟體)

按退出鍵,看起來也是退出沒錯,但這個軟體其實是被轉為了空置程式(**除外,**屬於有服務的特殊軟體)

獨特的程序管理策略

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

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

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

android將程序進行了分類:

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

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

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

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

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

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

結束程序的順序:empty>content provider>hidden>secondary server>visible>foreground。

檢視現在的設定可以: shell@android:/sys/module/lowmemorykiller/parameters $ cat adj                

0,1,2,4,9,15  

0,1,2,4,9,15的oom_adj值對應foreground>visible>secondary server>hidden>content provider>empty

android可根據「oom_adj」值的範圍來決定程序管理策略,比如可以設定「當記憶體小於x時,結束「oom_adj」大於y的程序」。檢視現在的設定可以: shell@android:/sys/module/lowmemorykiller/parameters $ cat minfree             3599,4881,6164,8212,9495,11294

對應foreground>visible>secondary server>hidden>content provider>empty顯示出的應該是6個數字,以逗號隔開,例如:3599,4881,6164,8212,9495,11294注意這些數字的單位是page. 1 page = 4 kb.上面的六個數字對應的就是(mb): 14,19,24,32,37,44

Android 記憶體管理機制

無意中在miui看到的文章,感覺不錯,轉了過來。原文如下 這種設計本來就是乙個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源。android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理記憶體的同學完全是因為被塞班或者windows毒...

Android 記憶體管理機制

本文 android 記憶體管理機制是android開發者必須要懂得的,是實現上層應用的基礎。下面就來談一談。以上這些設計確保了安卓android的穩定性,正常情況下最多單個程式崩潰,但整個系統不會崩潰,也永遠沒有記憶體不足的提示出現.大家可能是被windows毒害得太深了,總想保留更多的記憶體,但...

android記憶體管理機制(一)

無意中在miui看到的文章,感覺不錯,轉了過來。原文如下 這種設計本來就是乙個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源。android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理記憶體的同學完全是因為被塞班或者windows毒...