Android分析之LowMemoryKiller
Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。
Low memory killer 则是定时进行检查。
Low memory killer 主要是通过进程的oom_adj 来判定进程的重要程度。这个值越小,程序越重要,被杀的可能性越低。
oom_adj的大小和进程的类型以及进程被调度的次序有关。
Low memory killer 的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c
1.oom_adj的值是如何赋予的
进程的类型,可以在ActivityManagerService中清楚的看到:
其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:
在init.rc中:
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel.
# Define the memory thresholds at which the above process classes will
# be killed.
配置文件有如下两个:
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller /parameters/minfree
owmeme_adj中各项数值代表阈值的警戒级数,
lowmem_minfree代表对应级数的剩余内存。
adj文件存放着oom_adj 内存警戒值( 以4K为单位)
0 1536
1 2048
2 4096
7 5120
14 5632
15 6144
也就是说,当系统的剩余内存为小于6MB时候,警戒级数为0,当系统内存剩余小于8M而大于
6M的时候,警戒级数为1,当内存小于64M大于16MB的时候,警戒级数为12.
对于某些小内存设备,我们可以调整对应的门限值,例如:
一般调整后三个值。
echo “1536,2048,4096,15360,17920,20480″>/sys/module/lowmemorykiller/parameters/minfree
原文作者:AndyTsui
原文链接:http://blog.csdn.net/AndyTsui/archive/2011/02/27/6210653.aspx
2.LMK的工作机制
3.tips
# Write value must be consistent with the above properties.
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
write /proc/sys/vm/overcommit_memory 1
write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144
class_start default
(3)dumpsys activity可以dump进程的信息,查看adj值(2)进程oom_adj同样可以进行设置,通过write /proc/<PID>/oom_adj
,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16