资讯详情

android LMK(low memory killer) 工作机制

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清晰可见:

static final int EMPTY_APP_ADJ;

static final int HIDDEN_APP_MAX_ADJ;

static final int HIDDEN_APP_MIN_ADJ;

static final int HOME_APP_ADJ;

static final int BACKUP_APP_ADJ;

static final int SECONDARY_SERVER_ADJ;

static final int HEAVY_WEIGHT_APP_ADJ;

static final int PERCEPTIBLE_APP_ADJ;

static final int VISIBLE_APP_ADJ;

static final int FOREGROUND_APP_ADJ;

static final int CORE_SERVER_ADJ = -12;

static final int SYSTEM_ADJ = -16;

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.These are used in ActivityManagerService.

setprop ro.FOREGROUND_APP_ADJ 0

setprop ro.VISIBLE_APP_ADJ 1

setprop ro.SECONDARY_SERVER_ADJ 2

setprop ro.HIDDEN_APP_MIN_ADJ 7

setprop ro.CONTENT_PROVIDER_ADJ 14

setprop ro.EMPTY_APP_ADJ 15

# Define the memory thresholds at which the above process classes will

# be killed.These numbers are in pages (4k).

setprop ro.FOREGROUND_APP_MEM 1536

setprop ro.VISIBLE_APP_MEM 2048

setprop ro.SECONDARY_SERVER_MEM 4096

setprop ro.HIDDEN_APP_MEM 5120

setprop ro.CONTENT_PROVIDER_MEM 5632

setprop ro.EMPTY_APP_MEM 6144

配置文件有如下两个:

/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

也就是说,当系统的剩余内存小于6时MB时候,警戒级数为0,当系统内存剩余小于8M而大于 6M当内存小于64时,警戒级数为1。M大于16MB警戒等级为12.

对于一些小内存设备,我们可以调整相应的门限值,例如: 一般调整后三个值。 echo 1536,2048,4096,15360,17920″>/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中配置:

# 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//oom_adj,在init.rc中,init进程的pid为1,omm_adj配置为-16,永远不会被杀死。

# Set init its forked children's oom_adj.

write /proc/1/oom_adj -16 (3)dumpsys activity可以dump查看过程信息adj值

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

标签: lmk307液位传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台