Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。

    那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low memory killer机制。

 

Low memory killer 则是定时进行检查。

Low memory killer 主要是通过进程的oom_adj 来判定进程的重要程度。这个值越小,程序越重要,被杀的可能性越低。

oom_adj的大小和进程的类型以及进程被调度的次序有关。

Low memory killer 的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c

1.oom_adj的值是如何赋予的

 

进程的类型,可以在ActivityManagerService中清楚的看到: 

   

   

   

   

   

   

   

   

   

   

   

   

   ActivityManagerService定义各种进程的oom_adj,CORE_SERVER_ADJ代表一些核心的服务的omm_adj,数值为-12,这类进程永远也不会被杀死。

其他未赋值的都在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

2.LMK的工作机制


 


LMK开始工作时,


首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。


然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。


 


最关键的一步就是,发送SIGKILL信息,杀掉该进程。


 


3.tips


 


(1)在init.rc中配置:


# 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




(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



   procrank可以查看进程占用内存大小