Android內存管理機制 – Android移動開發技術文章_手機開發 Android移動開發教學課程

(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。

發佈留言