您的位置:首页 > 移动开发 > Android开发

Android分析之LowMemoryKiller

2012-07-05 18:13 501 查看
Android分析之LowMemoryKillerAndroidKernel会定时执行一次检查,杀死一些进程,释放掉内存。那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Lowmemorykiller机制。Lowmemorykiller则是定时进行检查。Lowmemorykiller主要是通过进程的oom_adj来判定进程的重要程度。这个值越小,程序越重要,被杀的可能性越低。oom_adj的大小和进程的类型以及进程被调度的次序有关。Lowmemorykiller的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c

1.oom_adj的值是如何赋予的

进程的类型,可以在ActivityManagerService中清楚的看到:staticfinalintEMPTY_APP_ADJ;staticfinalintHIDDEN_APP_MAX_ADJ;staticfinalintHIDDEN_APP_MIN_ADJ;staticfinalintHOME_APP_ADJ;staticfinalintBACKUP_APP_ADJ;staticfinalintSECONDARY_SERVER_ADJ;staticfinalintHE***Y_WEIGHT_APP_ADJ;staticfinalintPERCEPTIBLE_APP_ADJ;staticfinalintVISIBLE_APP_ADJ;staticfinalintFOREGROUND_APP_ADJ;staticfinalintCORE_SERVER_ADJ=-12;staticfinalintSYSTEM_ADJ=-16;ActivityManagerService定义各种进程的oom_adj,CORE_SERVER_ADJ代表一些核心的服务的omm_adj,数值为-12,这类进程永远也不会被杀死。其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:在init.rc中:#Definetheoom_adjvaluesfortheclassesofprocessesthatcanbe#killedbythekernel.TheseareusedinActivityManagerService.setpropro.FOREGROUND_APP_ADJ0setpropro.VISIBLE_APP_ADJ1setpropro.SECONDARY_SERVER_ADJ2setpropro.HIDDEN_APP_MIN_ADJ7setpropro.CONTENT_PROVIDER_ADJ14setpropro.EMPTY_APP_ADJ15#Definethememorythresholdsatwhichtheaboveprocessclasseswill#bekilled.Thesenumbersareinpages(4k).setpropro.FOREGROUND_APP_MEM1536setpropro.VISIBLE_APP_MEM2048setpropro.SECONDARY_SERVER_MEM4096setpropro.HIDDEN_APP_MEM5120setpropro.CONTENT_PROVIDER_MEM5632setpropro.EMPTY_APP_MEM6144配置文件有如下两个:/sys/module/lowmemorykiller/parameters/adj/sys/module/lowmemorykiller/parameters/minfreeowmeme_adj中各项数值代表阈值的警戒级数,lowmem_minfree代表对应级数的剩余内存。adj文件存放着oom_adj内存警戒值(以4K为单位)01536120482409675120145632156144也就是说,当系统的剩余内存为小于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的工作机制

LMK开始工作时,首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。最关键的一步就是,发送SIGKILL信息,杀掉该进程。

3.tips

(1)在init.rc中配置:
#Writevaluemustbeconsistentwiththeaboveproperties.
write/sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15
write/proc/sys/vm/overcommit_memory1
write/sys/module/lowmemorykiller/parameters/minfree1536,2048,4096,5120,5632,6144
class_startdefault
(2)进程oom_adj同样可以进行设置,通过write/proc/<PID>/oom_adj,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。#Setinititsforkedchildren'soom_adj.
write/proc/1/oom_adj-16
(3)dumpsysactivity可以dump进程的信息,查看adj值procrank可以查看进程占用内存大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: