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

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);
}

二、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

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);
}

三、实例说明

cat /sys/module/lowmemorykiller/parameters/adj

0,58,117,176,529,882
cat /sys/module/lowmemorykiller/parameters/minfree

3900,4500,6000,7000,10000,15000
说明:

当一个进程的空闲存储空间下降到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掉。

四、修改方法

I/ActivityManager( 3568): Killing 17974:com.*.*.*/1000 (adj 5): kill background

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

在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值。


你可能感兴趣的:(移动操作系统之Android)