(1)Android系統是基於Linux 2.6核心開發的開源作業系統,而linux系統的記憶體管理有其獨特的動態儲存裝置管理機制。不過Android系統對Linux的記憶體管理機制進行了最佳化,Linux系統會在進程活動停止後就結束該進程,而Android把這些進程都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的進程通常情況下不會影響整體系統的運行速度,並且當使用者再次啟用這些進程時,提升了進程的啟動速度。
(2)Android的Low Memory killer是在標準的linux kernel的OOM基礎上修改而來的一種記憶體管理機制,當系統記憶體不足時,殺死Bad進程釋放其記憶體,Bad進行的選擇標準有2個:oom_adj和佔用記憶體的大小,oom_adj代表進程的優先順序,數值越大,優先順序越高,對應每個oom_adj都有一個空閑記憶體的閥值。系統會對進程的重要性進行評估,並將重要性以“oom_adj”這個數值表示出來,賦予各個進程。Android Kernel每隔一段時間會檢查當前記憶體是否低於某個閥值,如果是,則殺死oom_adj最大的Bad進程,如果有2個以上的Bad進程oom_adj相同,則殺死其中佔用記憶體最多的進行
(3)Android將程式的重要性分成以下幾類,按照重要性依次降低的順序:
名稱 oom_adj 解釋
FOREGROUD_APP 0 前景程式,可以理解為你正在使用的程式
VISIBLE_APP 1 使用者可見的程式
SECONDARY_SERVER 2 後台服務,比如說QQ會在後台運行服務
HOME_APP 4 HOME,就是主介面
HIDDEN_APP 7 被隱藏的程式
CONTENT_PROVIDER 14 內容提供者,
EMPTY_APP 15 空程式,既不提供服務,也不提供內容
其中每個程式都會有一個oom_adj值,這個值越小,程式越重要,被殺的可能性越低。
(4)除了上述程式重要性分類之外,Android系統還維護著另外一張表,這張表是一個對應關係,以N1為例:
oom_adj 記憶體警戒值( 以4K為單位)
0 1536
1 2048
2 4096
7 5120
14 5632
15 6144
這個表是定義了一個對應關係,每一個警戒值對應了一個重要性值,當系統的可用記憶體低於某個警戒值時,就殺掉所有大於該警戒值對應的重要性值的程式。比如說,當可用記憶體小於6144 * 4K = 24MB時,開始殺所有的EMPTY_APP,當可用記憶體小於5632 * 4K = 22MB時,開始殺所有的CONTENT_PROVIDER和EMPTY_APP。
(5) alter minfree改的是什麼呢,上面這張對應表是由兩個檔案組成的:
/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree。