e-works数字化企业网  »  文章频道  »  基础信息化  »  移动应用

Android 进程回收之LowMemoryKiller原理篇

2017/10/2    来源:云栖社区    作者:佚名      
关键字:Android  LowMemoryKiller  
在前面的文章Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及LowMemoryKiller简称低内存杀死机制。

    从上面的不同点1可以看出,5.0之后是通过ProcessList类去设置oomAdj,其实这里就是通过socket与LMKD服务进行通信,向lmkd服务传递给LMK_PROCPRIO命令去更新进程优先级:
 
Android 进程回收之LowMemoryKiller原理篇
 
    其实就是openLmkdSocket打开本地socket端口,并将优先级信息发送过去,那么lmkd服务端如何处理的呢,来看看lmkd服务的入口main函数:
 
Android 进程回收之LowMemoryKiller原理篇
 
    很简单,打开一个端口,并通过mainloop监听socket,如果有请求到来,就解析命令并执行,刚才传入的LMK_PROCPRIO命令对应的操作就是cmd_procprio,用来更新oomAdj,其更新新机制还是通过proc文件系统。
 
Android 进程回收之LowMemoryKiller原理篇
 
    与4.3版本相比,5.0的LMKD简化了很多AMS的东西。
 
   Android 进程回收之LowMemoryKiller原理篇
 
    LomemoryKiller内核区块
 
    LomemoryKiller属于一个内核驱动模块,主要功能是:在系统内存不足的时候扫描进程队列,找到低优先级(也许说性价比低更合适)的进程并杀死,以达到释放内存的目的。对于驱动程序,入口是__init函数。
 
Android 进程回收之LowMemoryKiller原理篇
 
    LomemoryKiller将自己的lowmem_shrinker入口注册到系统的内存检测模块去,作用就是在内存不足的时候可以被回调,register_shrinker函数是一属于另一个内存管理模块的函数。
 
Android 进程回收之LowMemoryKiller原理篇
 
    最后,看一下,当内存不足触发回调的时候,LomemoryKiller是如何找到低优先级进程,并杀死的。管家代码就在lowmem_shrink函数里面:
 
Android 进程回收之LowMemoryKiller原理篇
Android 进程回收之LowMemoryKiller原理篇
 
    上面的逻辑很清楚,通过给应用设置内存对应的阈值,通过Linux的中的信号量,发送SIGKILL信号直接将进程杀死。关于LomemoryKiller和Linux底层通信的原理,请大家自行学习相关的文章介绍。
 
责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
兴趣阅读
相关资料
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐