android内存机制 演变,Android的lowmemorykiller演变分析

在学习Android的lowmemorykiller机制过程中,发现从KK到L再到M有一些新的变化,因此有必要进行一下总结。在开始分析前先厘清一些基础概念,便于描述的展开和结论的形成。本文内容并没涉及太多具体实现细节,目的只是为实际的开发提供纲领性指导意见。

一、基本概念

1、PageCache:Linux内核为加快文件预取而采用的特有机制(参考引用一),就是尽可能的把空闲内存用于缓存最近访问过的磁盘文件数据。由于会占用大量的空闲内存,在某种情况下就会导致OOM的发生。Linux内核的内存管理是很重要的部分,需要花很多时间和精力来学习(参考引用二)。

2、OOM:即“Out of Memory”的缩写,这个其实是标准Linux内核的一种内存管理机制,在内存不足或无法分配(大)内存的时候会触发此机制,来完成内存的回收。具体到代码级别,内存页面回收机制是Cache Shrinker,通过内核线程kswapd监控内存页面情况和触发Shrinker回调函数进行内存页面回收。

3、lowmemorykiller(简称LMK,下同):是Android基于标准Linux内核OOM机制修改而来,最初的方式是通过在内核实现一个staging形式的驱动,在此驱动中注册Shrinker回调函数和实现应用策略,剩下的工作就是定时检查及判断是否需要回收(或定时检测和内核触发相结合???)。关于OOM和LMK详细信息可参考引用三。

4、CGroup:简单的说就是对进程线程使用各种系统资源的分组管理和控制,包括如CPU、IO、MEMORY,等等。

二、LMK实现演变

1、在Android的KK(或之前)版本中,LMK机制和策略都是在内核空间驱动中实现的,驱动提供两个sys文件结点给AMS用于设置触发内存回收的阀值。

2、在Android的L(或之后)版本中,引入了一个处于用户空间的守护进程lmkd(参考引用四),LMK机制和策略的实现多了一种选择---即可在用户空间完成。但不管是旧的还是新的方式,原来由AMS完成的设置工作都通过socket方式传递参数给lmkd来实际完成。这样一来AMS与内核的耦合性进一步降低,把精力关注于activity的管理。

三、lmkd进程分析

关于lmkd的作用在修改日志中很明确:

Author: Todd Poynor

Date: Tue Jul 9 19:35:14 2013 -0700

Add lmkd low memory killer daemon

Move kernel low memory killer logic to new daemon lmkd. ActivityManager

communicates with this daemon over a named socket.

为什么导入lmkd,根据我的经验分析一来在用户空间实现策略更容易优化和管控,二来LMK驱动是Android特有的东西不太容易进入Linux内核的正式驱动列表(一直是staging形式)。在google groups的一个讨论组(android-platform)的贴子中也提到了类似的观点(引用五,需自备楼梯):

Dual supported in L. For example N9 released with lmk due to its advanced architecture

giving an edge to lmk over lmkd. Low memory killing is an important feature on all

Android Devices and its tuning and optimization is a requirement to provide the best

and balanced user experience. The option of either improves the tuning options of the

device manufacturers. Support for lmk scales because of its inclusion upstream in the

kernel. Our goal is to improve lmkd as an optimized replacement with algorithms that

live well in the android ecosystem. 考虑到使用Android版本内核的差异性,lmkd进程的实现是兼容了新旧两种不同方式的: (1) 使用LMK驱动(旧的方式),配置阀值参数保存在驱动中,LMK策略由驱动实现,内核通过Shrinker机制触发策略执行; (2) 不使用LMK驱动(新的方式),配置阀值参数保存在lmkd进程中,LMK策略由lmkd进程实现。但为了触发策略的执行,必须定制内核加入memory cgroup,通过监控memory pressure event来触发LMK策略执行; 根据lmkd的实现意图,理论上来说应该使用第二种方式才对; 四、memory pressure event         这个其实也是标准Linux内核在2013年4月就已经实现的功能(提交者为Anton Vorontsov,patch的标题是“memcg: Add memory.pressure_level events”)。基于memory cgroup,内核可以分析当前内存的使用情况压力等级(low、medium、critical),并把相关信息通过eventfd方式通知给用户空间的监听者执行相关动作(如内存回收)。                 memory pressure event的实现(引用六)经过四次review(多人参与讨论,包括Linus Torvalds、Andrew Morton等大boss)才进入mainline,不得不配服国外开源环境的活跃及严谨治学态度。在这一系列讨论中也有人提及Android相关考虑,作者的想法就是实现一个通用的方式(包括对Android等移动设备支持)。         从lmkd是2013年7月提交时间来看,借助memory pressure event方式的实现,google终于如愿以标准Linux内核方式消除了staging形式LMK驱动这个“鱼刺”。至于使用memory pressure event方式的内存回收效率及实际效果如何,未进行相关测试前就不得而知了。 五、引用 1、linux的page cache策略 http://blog.csdn.net/fall221/article/details/46290563 2、linux内存管理各文件简介 http://blog.csdn.net/u011955950/article/details/18860379 3、android Low Memory Killer介绍 http://blog.csdn.net/hgl868/article/details/6744883 4、Android——内存管理-lowmemorykiller 机制 http://blog.csdn.net/jscese/article/details/47317765 5、why lmkd and logd are created to move log and lmk from kernel to userspace in L? https://groups.google.com/forum/#!topic/android-platform/PW85I7qRBP8 6、memcg: Add memory.pressure_level events https://patchwork.kernel.org/patch/2123031/ https://patchwork.kernel.org/patch/2161601/ https://patchwork.kernel.org/patch/2318281/ https://patchwork.kernel.org/patch/2384491/

安卓手机内存优化调研 背景 现在安卓手机在相机操作下,不可避免要大量消耗内存资源,同时当今手机如同电脑一样,前台相机,后台各种app进程,都会消耗内存。因而会出现相机场景下,系统可用内存不足,内存压力增加不少,对相机性能会带来严重的影响。因此需要调查相机场景下的内存优化方法。 memcg调研 memcg的好处: 1 监控进程使用内存 站在一个普通Linux开发者的角度,如果能控制一个或者一组进程所能使用的内存数,那么就算代码有bug,内存泄漏也不会对系统造成影响,因为可以设置内存使用量的上限,当到达这个值之后可.. 阅读详情

相关推荐

Android13 针对low memory killer内存调优

在旧版本的安卓系统中,当触发lmk(low memory killer)的时候一般认为就是内存不足导致,但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小,io,cpu同样会做评判,从而保证设备性能。这里控制是通过监听kernel里的epoll事件,然后做相关判断进行进程的kill,这里代表了内存失速,由于我们3g内存其实也并不是很宽裕,通过killinfo我们可以看到psi最后一项达到了23.650000证明cpu压力很大,证明系统回收内存压力较大,我们通过修改。内存压力检测的默认机制

superjaingchao的专栏 4340

android内存方法,android onLowMemory内存回调方法详解

onLowMemory方法顾名思义就是在app内存低的时候回调,那么怎样才是内存低的标准,回调流程又是如何?我们一起带着问题去看源代码解析。onLowMemory方法在Activity,Servier,ContentProvider,Application中都有回调,但是BroadcastReceiver没有这个回调。MemBinder是一个Binder类型的服务,主要用于检测系统内存情况;当系统...

weixin_39640008的博客 1327

Android lowmemorykiller分析

目录 概述 lmkd lowmemorykiller 总结   1.概述 Android底层还是基于Linux,在Linux中低内存是会有oom killer去杀掉一些进程去释放内存,而Android中的lowmemorykiller就是在此基础上做了一些调整来的。因为手机上的内存毕竟比较有限,而Android中APP在不使用之后并不是马上被杀掉,虽然上层ActivityManagerServic

人生如逆旅 1万+

Android中的LowMemoryKiller机制

进程的启动分为冷启动和热启动,当用户退出进程后,Android系统不会立即将此进程回收,而是将其放到后台运行,下次再启动这个程序的时候,直接将这个放在后台的进程拉起来使用,加快启动速度,这种启动方式称为热启动。而冷启动则是重新为这个程序分配进程。那么问题来了,当启动的程序较多,然后又退出了,后台就会留下很多这种空的进程,占...

weixin_40254258的博客 718

Android 内存管理之LowMemoryKiller实现原理分析

现在的Android手机,硬件的配置越来越强大,内存已经从当时的1G,2G向着6G,8G去进行了过度。 但是,应用占用内存的情况,尤其是大型的游戏,多开的应用,对内存的占用情况也是在不停地上升。 当内存在某个时间被占用的比较满的情况下,合理的杀死一些应用,并释放内存,是Android进行性能提升的一个手段。 这个也就是一直说的LowMemoryKiller机制。 我们平时使用华为,小米等手机,也会发现在一定的情况下,后台的进程被很快的杀死,这个就涉及到了LMK的一些定制。 本篇文章,我们会分析LMK的机制

猿氏悟语 4039

LowMemoryKiller机制分析

lowmem

qq_43898917的博客 1190

Android进程内存管理-lowmemorykiller

oom_adj, oomKiller, lowmemorykiller

m0_74934294的博客 1708

Android LowMemoryKiller概述

Android LowMemoryKiller

weixin_42136255的博客 2116

Android LowmemoryKiller机制

为什么引入LowmemoryKiller? 进程的启动分冷启动和热启动,当用户退出某一个进程的时候,并不会真正的将进程退出,而是将这个进程放到后台,以便下次启动的时候可以马上启动起来,这个过程名为热启动,这也是Android的设计理念之一。这个机制会带来一个问题,每个进程都有自己独立的内存地址空间,随着应用打开数量的增多,系统已使用的内存越来越大,就很有可能导致系统内存不足。为了解决这个问题...

zhzhangnews的博客 1852

android内存管理-lowmemorykiller 机制

android内存管理-lowmemorykiller 机制概念andorid用户层的application process ,在各种activity生命周期切换时,会触发AMS中的回收机制,比如启动新的apk,一直back 退出一个apk,在5.1上的代码来看,除了android AMS中默认的回收机制外,还会去维护一个oom adj 变量,作为linux层 lowmemorykiller的参考...

weixin_34007879的博客 606

安卓内存机制

安卓内存机制

似霰的博客 1766

记录Slab占用内存过大导致kill程序的情况

起因 在应用程序的老化测试时发现,系统被kill掉,但是从kill掉的内核打印信息,没有发现太大的问题。 [411371.892812] ntpd invoked oom-killer: gfp_mask=0x27000c0(GFP_KERNEL_ACCOUNT|__GFP_NOTRACK), nodemask=0, order=1, oom_score_adj=0 [411371.911869]...

chengwei_peng 7568

Android 6.0的lowmemorykiller机制

最近在处理一些lowmemorykiller相关的问题,于是对lowmemorykiller机制作了一个简单的了解。在这里总结一下。 首先,是lowmemorykiller的一些背景知识。 众所周知,Andorid的实质是一个linux的操作系统。所以和其他操作系统一样,每个程序,每个进程运行,都需要一定内存空间进行支撑。而进程的内存空间只是虚拟内存,程序运行需要的是实实在在的

u012440406的专栏 1万+

Android内存优化配置

zram的确可以优化内存不足的问题,但是心病还需心药医,内存不足最根本还是要从内存入手,增大内存才是治标治本之法。

lojotee的博客 5868

AndroidLow Memory Killer和OOM的关系

首先,我们要明白OOM是一种异常,LMK是Android系统上的一种防止OOM的内存保护机制。 关于LowMemoryKiller Andorid的Low Memory Killer是在标准的linux lernel的OOM基础上修改而来的一种内存管理机制。 使用LowMemoryKiller可以使系统内存较低时,调出进程管理器结束不必要的人进程释放空间。在安卓中,如果等到真正的OOM时,也许进......

学无止境 2914

Android底层内存回收机制介绍

Android底层基于Linux内核开发.随着Android版本不断更新,内存回收机制也在不断变化.本文简要介绍下不同版本下的内存回收原理. Linux OOM机制 OOM(out of memory)是linux中内存管理机制的一种,在系统可用内存较少的情况下,内核为了保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存.通常oom_killer的触发流程是: 进程A想要分...

aizjbzw18785的博客 1321

Android的LMK机制学习笔记

详细介绍了AndroidLow Memory Killer (LMK)机制。分享了自己在处理后台应用程序被杀死问题时的分析过程。LMK机制是基于Linux的OOM killer修改而来,主要通过驱动层实现,定期检查系统可用内存,并根据预设的内存阈值,杀死优先级低的进程。文章还深入解析了lowmemorykiller.c文件的核心逻辑,包括内存阈值的设定、进程遍历和查杀流程。文中还探讨了内核层面的log信息,以及AMS如何通知被杀进程进行数据清理。

TechMix的博客 2171
上一篇: 鸿蒙实力等级划分,从综漫开始的万界之旅
下一篇: html时间转换为星期几,javascript给定日期如何显示星期几?
睡棉絮的人
博客等级 码龄7年 53粉丝 84原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值