Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的Low Memory Killer

Android中的Low Memory Killer

編輯:關於Android編程

 

在現有的技術條件下,內存永遠都是一個吃緊的資源,不用說是PC上會出現內存不足的可能,更不必說在移動設備上了。一旦出現內存不足就會導致系統卡頓,影響用戶體驗。而Android運行在Linux的基礎之上,Linux的內存的使用原則就是不要浪費內存,所以在程序退出時在一段時間內還停留在內存中,這也是我們下一次打開程序時發現快一些的原因;但是這樣帶來的壞處就是如果駐留在內存中的程序多了,容易導致OOM的可能。
在Linux中有一個內存監控機制OOMKiller,一旦發現內存使用進入一個臨界值就會自動按照一定的策略來清理,它的核心思想是:
1 按照優先級,從低到高來殺死進程,回收內存資源 2 一方面要考慮殺死進程給系統帶來的損壞要盡量小,另一方面要釋放盡量多的內存 具體的做法是OOMKiller會根據一些參考因素如進程消耗內存,運行時間,OOM權重等指標計算出一個oom_score分數,這個分數越低,進程被殺死的概率越小,被殺死的時間越晚。 而對於Android系統來說是實現一個不同級別的killer,這個模塊名稱為Low Memory Killer,代碼在drivers/staging/android/LowMemoryKiller.c文件中

 static int __init lowmem_init(void)
 {
         register_shrinker(&lowmem_shrinker);
         return 0;
}
代碼中注冊一個shrinker監聽器,如果系統空間頁面低於一定的阈值,執行這個lowmem_shrinker函數
該文件中定義了兩個重要的數組:

static int lowmem_adj[6] = { 0, 1, 6, 12, }; static int lowmem_adj_size = 4; static size_t lowmem_minfree[6] = { 3 * 512, /* 6MB */ 2 * 1024, /* 8MB */ 4 * 1024, /* 16MB */ 16 * 1024, /* 64MB */ }; static int lowmem_minfree_size = 4;

上面定義的兩個數組時一一對應的,其中lowmem_adj表示的是被處理某一個級別的adj的值,lowmen_minfree則表示該級別對應的內存阈值。比如說adj=0的級別,它對應的內存阈值是6M,也就是在可用內存小於6M時,會清除adj大於等於0的所有進程。所以可以看出adj越小,它被殺死的可能越小。 上面定義的是系統默認的,可以通過設置相應的文件來修改這兩組值: /sys/module/lowmemorykiller/parameters/adj /sys/module/lowmemorykiller/parameters/minfree (以頁為單位,一般是4KB大小)
在Android系統中定義了幾個adj的值,他的意義分別如下: \ \

這些是系統提供的adj,我們還可以改變自己進程的adj值,有以下兩種方式: 1 寫文件 寫/proc/pid/oom_adj 值,在init.rc文件中就經常看到這種語句 on early-init write /proc/1/oom_adj -16 設置init進程的adj 值為-16,屬於系統進程永遠不會被殺死
2 設置persistent屬性。 在AndroidManifest.xml文件中設置這個屬性為true,即可將其adj的值設置為-12,處於這個級別的進程基本上也不會被殺死,比如電話。







  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved