Android內存管理之LMK和OOM

oom(out of memory)

lom(Low on memory)

內存使用情況查看:

procrank

dumpsys meminfo

一、LMK——Low Memory Killer

  Android Kernel 會定時執行一次檢查,殺死一些進程,釋放掉內存,採用的就是Low memory killer機制。

  LMK開始工作時,首先根據閾值表確定當前的警戒級數,則高於警戒級數的進程是待殺的範圍。

  然後遍歷所有進程的oom_adj值,找到大於min_adj的進程,若找到多個,則把佔用進程最大的進程存放在selected中。 

  最關鍵的一步就是,發送SIGKILL信息,殺掉該進程。

Kernel_3.10.40/drivers/staging/android/lowmemorykiller.c

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">static struct shrinker lowmem_shrinker = {
        .shrink = lowmem_shrink,
        .seeks = DEFAULT_SEEKS * 16
};

static int __init lowmem_init(void)
{
        register_shrinker(&lowmem_shrinker);
        return 0;
}

static void __exit lowmem_exit(void)
{
        unregister_shrinker(&lowmem_shrinker);
}

static int lowmem_shrink(struct shrinker *s, struct shrink_control *sc)
{
  send_sig(SIGKILL, selected, 0);
}</span></span></span>

二、OOM——out of memory

  如果上述各種方法(包括LMK)都無法釋放出足夠的內存空間,那麼當爲新的進程分配應用程序時將發生 Out of Memory 異常,OOM_killer 將盡最後的努力殺掉一些進程來釋放空間。

  Linux下有一種OOM KILLER 的機制,它會在系統內存耗盡的情況下,啓用自己算法有選擇性的kill 掉一些進程。
//////////////////
device/mstar/common/build/mtv-xhdpi-1024-dalvik-heap.mk
dalvik.vm.heapgrowthlimit=128m
system/build.prop

dalvik.vm.heapgrowthlimit=128m

Kernel_3.10.40/oom_kill.c

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
                      unsigned int points, unsigned long totalpages,
                      struct mem_cgroup *memcg, nodemask_t *nodemask,
                      const char *message)
{
  do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
}</span></span></span>

三、實例說明

cat /sys/module/lowmemorykiller/parameters/adj

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">0,58,117,176,529,882</span></span></span>
cat /sys/module/lowmemorykiller/parameters/minfree

<span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">3900,4500,6000,7000,10000,15000</span></span></span>
說明:

當一個進程的空閒存儲空間下降到15000個頁面時,oom_adj值爲882或更大的進程將被kill掉;

當一個進程的空閒存儲空間下降到10000個頁面時,oom_adj值爲529或更大的進程將被kill掉;

當一個進程的空閒存儲空間下降到7000個頁面時,oom_adj值爲176或更大的進程將被kill掉;

當一個進程的空閒存儲空間下降到6000個頁面時,oom_adj值爲117或更大的進程將被kill掉;

當一個進程的空閒存儲空間下降到4500個頁面時,oom_adj值爲58或更大的進程將被kill掉;

當一個進程的空閒存儲空間下降到3900個頁面時,oom_adj值爲0或更大的進程將被kill掉。

四、修改方法

<span style="font-size:14px;">I/ActivityManager( 3568): Killing 17974:com.*.*.*/1000 (adj 5): kill background</span>

這是需要應用AndroidManifest.xml增加android:persistent="true";

在AndroidManifest.xml文件中對於intent-filter可以通過android:priority = "1000"這個屬性設置最高優先級,1000是最高值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章