`

Android Low Memory Killer

阅读更多
Android Low Memory Killer介绍
基本原理:

Android的Low Memory Killer是在标准linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存。Bad进程的选择标准有两个:oom_adj和占用内存的大小。oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阈值。Android Kernel每隔一段时间会检查当前空闲内存是否低于某个阈值,如果是,则杀死oom_adj最大的Bad进程,如果有两个以上Bad进程oom_adj相同,则杀死其中占用内存最多的进程。 

Low Memory Killer与OOM的区别

OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:

OOM基于多个标准给每个进程打分,分最高的进程将被杀死;Low MemoryKiller则用oom_adj和占用内存的大小来选择Bad进程,OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。

Low Memory Killer的实现

Low Memory Killer的源代码在drivers/staging/Android/lowmemorykiller.c中,它是通过注册Cache Shrinker来实现的。Cache Shrinker是标准linux kernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,kswapd会调用注册的Shrinker回调函数,来回收内存页面。

Low Memory Killer是在模块初始化时注册Cache Shrinker的,代码如下:

static int__init lowmem_init(void)

{

register_shrinker(&lowmem_shrinker);//注册Cache Shrinker

return 0;

}

lowmem_shrinker的定义如下:

static struct shrinker lowmem_shrinker=

{

.shrink=lowmem_shrink,

.seeks=DEFAULT_SEEKS*16

};

register_shrinker会将lowmem_shrink加入Shrinker List中,被kswapd在遍历Shrinker List时调用,而Low Memory Killer的功能就是在lowmem_shrink中实现的。

lowmem_shrink用两个数组作为选择Bad进程的依据,这两个数组的定义如下:

static int lowmem_adj[6]=

{

0,

1,

6,

12,

};

static int lowmem_adj_size=4;

static size_t lowmem_minfree[6]={

3*512,//6MB

2*1024,//8MB

4*1024,//16MB

16*1024,//64MB

};

lowmem_minfree保存空闲内存的阈值,单位是一个页面4K,lowmem_adj保存每个阈值对应的优先级。lowmem_shrink首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。

lowmem_shrink杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL信号:

force_sig(SIGKILL,selected);



用户接口

设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口:/proc/<进程pid>/oom_adj。

Android启动时读取的配置文件/init.rc中定义了相应的属性供AP使用并有设置这些参数:

#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.BACKUP_APP_ADJ 2

setprop ro.HOME_APP_ADJ 4

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.BACKUP_APP_MEM 4096

setprop ro.HOME_APP_MEM 4096

setprop ro.HIDDEN_APP_MEM 5120

setprop ro.CONTENT_PROVIDER_MEM 5632

setprop ro.EMPTY_APP_MEM 6144

#Write value must be consistent with the above properties.

#Note that the driver only supports 6 slots,so we have HOME_APP

at the

#same memory level as services.

write/sys/module/lowmemorykiller/parameters/adj

0,1,2,7,14,15

write/sys/module/lowmemorykiller/parameters/minfree

1536,2048,4096,5120,5632,6144

#Set init its forked children's oom_adj.

write/proc/1/oom_adj-16

从以上设置可以看出,将init进程oom_adj设置为-16,从而保证init进程永远不会被杀掉
分享到:
评论

相关推荐

    【性能】OOM原理解析:LowMemoryKiller原理

    随着应用打开数量的增多,系统已使用的内存越来越大,就很有可能导致系统内存不足, 那么需要一个能管理所有进程,根据一定策略来释放进程的策略,这便有了lmk,全称为LowMemoryKiller(低内存杀手),lmkd来决定什么...

    Android内核驱动——内存管理

    ### Android内核驱动——内存管理:深入理解LowMemoryKiller机制 #### 一、LowMemoryKiller概述 在深入探讨LowMemoryKiller之前,我们先了解下它的背景和作用。LowMemoryKiller(低内存杀手)是Android内核中一种...

    Android内核驱动——内存管理.pdf

    Low Memory Killer 提供了三个用户接口,分别是设置空闲内存阈值的接口 /sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口 /sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的...

    android 内存分析

    LowMemoryKiller 的核心逻辑实现在文件 `drivers/staging/android/lowmemorykiller.c` 中,通过注册 **CacheShrinker** 实现。CacheShrinker 本身是 Linux 内核用于回收内存页面的一种机制,通常由内核线程 kswapd ...

    Android内核驱动原理.pdf

    其对应的驱动程序位于`drivers/staging/android/lowmemorykiller.c`。在Linux内核中,Low Memory Killer负责将Linux的OOM(Out of Memory)机制具体实现并集成到Android系统中。此外,Android系统中还通过`kernel/...

    Android内核驱动—内存管理

    具体来说,LowMemoryKiller通过注册CacheShrinker来实现其功能,源代码位于`drivers/staging/android/lowmemorykiller.c`中。 - **注册过程**:在模块初始化时,通过`register_shrinker(&lowmem_shrinker)`函数将...

    Android双进程守护

    在Android系统中,进程守护是一种确保应用程序即使在主进程被杀死的情况下也能持续运行的技术。"Android双进程守护"是Android开发中的一个高级话题,它涉及到系统级服务、进程管理和NDK(Native Development Kit)的...

    android低内存管理策略

    LOWMEMORYKILLER是Android系统中负责内存管理的重要组件,它的主要任务是在系统检测到内存紧张时,根据预定义的策略,有序地终止那些非关键进程,从而释放内存空间,保证前台应用和服务的正常运行。这一机制的核心...

    Android-OOM.rar_memory android_memory for Android_out

    - Logcat日志:查找“dalvikvm-heap”或“Low Memory Killer”相关的错误信息。 - ANR(Application Not Responding):长时间执行主线程任务,导致系统认为应用无响应,也会显示OOM。 **4. 解决策略** - 对象复用...

    Android应用程序进程管理

    这个PPT讲Android应用程序进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android...

    Android内核和驱动篇-Android内核介绍[归纳].pdf

    源代码位于 drivers/staging/android/lowmemorykiller.c。 Low Memory Killer 是 Android 中的一种内存管理机制。当系统内存不足时,它可以杀死一些进程以释放内存,从而确保系统的稳定性。 4. 匿名共享内存...

    Android内存回收机制

    2、lowmemorykiller GC GC是java虚拟机的内存回收机制。Android GC原理探究https://www.jianshu.com/p/a7f31aee4e2e lowmemorykiller lowmemorykiller总结:https://www.jianshu.com/p/09922ab0390b oom 按照喜欢有...

    android内存管理了解.pptx

    LMK的实现位于`drivers/staging/Android/lowmemorykiller.c`,它通过注册为Cache Shrinker来参与内存回收过程。在内存不足时,内核线程kswapd会调用注册的Shrinker回调函数,即`lowmem_shrink`,以回收内存页。 2. ...

    Android 内核分析报告4

    ### Android内核分析报告:LowMemoryKiller深入解析 #### 一、基本原理 在Android系统中,**LowMemoryKiller**(以下简称LMK)是一种用于管理系统内存资源的重要机制。当系统的物理内存达到一定程度的紧张状态时,...

    android系统框架介绍

    Android系统使用的Linux内核包含了一些专用驱动,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,这些Android专用驱动构成了Android运行时的基石。Android运行时从下到上又包括了HAL层、应用...

    android内存管理机制分析[归类].pdf

    这部分代码位于`drivers/staging/Android/lowmemorykiller.c`。与Linux标准的OOM(Out Of Memory)管理器相比,它更加智能和灵活。 匿名共享内存(ashmem)允许进程之间共享大块内存,同时提供了内核回收和管理这些...

    android_system_memory_lmkd

    过去,在Android系统上,内存监视和非必要进程的杀死是由内核lowmemorykiller驱动程序处理的。 从Linux Kernel 4.12开始,lowmemorykiller驱动程序已被删除,而用户空间lmkd守护程序执行这些任务。 Android属性 可以...

Global site tag (gtag.js) - Google Analytics