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 将尽最后的努力杀掉一些进程来释放空间。
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是最高值。