LMK 工作机制

【Android】LMK 工作机制

Android分析之LowMemoryKiller

 

 

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

 

 

也就是说,当系统的剩余内存为小于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中配置:
# 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进程的pid1omm_adj被配置为-16,永远不会被杀死。

   # Set init its forked children's oom_adj.
   write /proc/1/oom_adj -16
(3)dumpsys activity可以dump进程的信息,查看adj值
   procrank可以查看进程占用内存大小

from: http://www.cnblogs.com/rayray/p/3413688.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/sys/module/lowmemorykiller/parameters/ 是一个内核参数路径,用于控制 Android 系统中的低内存杀死(Low Memory Killer)机制。以下是该路径下常见参数的含义: 1. minfree:表示当系统内存不足时,内核会杀死一些进程以释放内存。minfree 参数指定了系统可用内存的阈值,当可用内存低于该阈值时,内核会开始杀死进程。minfree 参数由六个数字组成,分别表示系统内存的不同阶段。例如“4096, 8192, 12288, 16384, 20480, 24576”表示当可用内存低于 4MB、8MB、12MB、16MB、20MB、24MB 时,内核会开始杀死进程。 2. lmk_minfree_ratio:与 minfree 类似,但是使用的是内存占比而非固定大小。例如“0, 1, 2, 4, 6, 8”表示当可用内存低于总内存的 0%、1%、2%、4%、6%、8% 时,内核会开始杀死进程。 3. lmk_minfree_adj:表示在低内存情况下,哪些进程会被优先杀死。进程的优先级由 Android 中的 OOM(Out of Memory)机制决定。lmk_minfree_adj 参数可以设置不同 OOM 分级的进程被杀死的 minfree 阈值。例如“0, 1, 2, 4, 9, 15”表示 OOM_ADJ_MIN_FREE(值为0)的进程在可用内存低于第一个 minfree 阈值时被杀死,而 OOM_ADJ_FOREGROUND(值为2)的进程在可用内存低于第三个 minfree 阈值时被杀死。 4. lmk_lru_percent:表示当内存紧张时,内核会清理掉多少 LRU(Least Recently Used)进程。LRU 进程指的是最近最少使用的进程,也就是说它们在内存中待的时间最久,但占用的内存却很少。lmk_lru_percent 参数指定了当可用内存低于 lmk_lru_percent% 时,内核会清理掉 LRU 进程。 5. lmk_inactive_file_ratio:表示当内存紧张时,内核会清理掉多少页缓存。页缓存指的是文件系统中的数据,例如应用程序的缓存文件、系统的日志文件等。lmk_inactive_file_ratio 参数指定了当可用内存低于总内存的 lmk_inactive_file_ratio% 时,内核会清理掉页缓存。 6. lmk_active_file_ratio:表示当内存紧张时,内核会清理掉多少页缓存。与 lmk_inactive_file_ratio 类似,但是 lmk_active_file_ratio 参数指定的是正在活跃使用的页缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值