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