导航:首页 > 操作系统 > lmkandroid

lmkandroid

发布时间:2025-05-20 23:37:13

Ⅰ 用户空间的LMKD

原文: https://source.android.com/devices/tech/perf/lmkd

本文描述了Android 9中添加的用户空间lowmemorykiller守护程序(lmkd)功能以及如何配置它们。

以前,Android使用内核lowmemorykiller驱动程序终止不必要的进程来缓解内存压力。这种机制死板且依赖于硬编码值,而且从内核4.12开始,lowmemorykiller驱动程序被排除在上游内核之外。

用户空间 lmkd 进程实现同样的功能,用已有的内核机制来检测和估计内存压力。它使用内核生成的vmpressure事件来获取有关内存压力级别的通知。它还可以使用内存cgroup功能根据其重要性限制分配给每个进程的内存资源。

从Android 9开始,如果未检测到内核中的lowmemorykiller驱动程序,则用户空间 lmkd 会激活。注:用户空间 lmkd 需要内核支持内存cgroup。因此,要切换到用户空间 lmkd ,应配置以下设置编译内核:

lmkd 同时支持新的和传统模式的终止策略,新的终止策略基于vmpressure事件,进程的重要性以及交换利用率等其他提示;传统模式的 lmkd 终止策略就像内核lowmemorykiller 驱动程序那样做出终止决定。

新的终止策略因低内存和高性能设备而异。在低内存设备的情况下,系统应该比正常操作模式承受更高的内存压力; 在高性能设备上,内存压力应被视为异常情况,在影响整体性能之前应予以修复。 ro.config.low_ram 属性允许选择一种模式而非另一种。有关设置此属性的说明,请参阅 低RAM配置 。

在传统模式下, lmkd 根据可用内存和文件缓存阈值进行终止决策。通过将 ro.lmk.use_minfree_levels 属性设置为 true 来启用此模式。

配置 lmkd 以下属性:

注: mem_pressure = RAM使用率/ RAM_and_swap使用率%

以下是一个设备配置示例:

Ⅱ 手机总是容易满内存,到底是什么在占内存

问这个问题,应该是Android手机的玩家吧,而且你对Android的内存机制也不了解,简单来说,Android中的内存就是给你用的,不用还不正常,根本不用担心内存怎么只剩下几百M呢。

像我们这些在Windows陪伴下成长起来的玩家,“内存不足”经常遇到,但是Android有着与Windows完全不一样的内存管理机制,Windows上的那一套,对Android并没用。

Android中可用内存是个没意义的数字

Windows中一旦程序被关闭,分配的内存也就释放出来,然而在Android中运行过的应用绝大多数是从前台转入到后台,并保留在内存中并不会也不需要主动释放,这样下次再运行该应用时,可以更快的启动。

无论手机的物理内存有多大,Android都能将其充分利用,将需要用到的数据从硬盘读入到内存,以提高数据访问性能,也就是说, 在Android系统中,可用内存越小,表明其调用的数据就越多,访问的命中率就越高,系统也就越快 。

你可能会问,当打开的应用越来越多,占用的内存总会爆满的,那怎么办呢?

Android有着优秀的内存回收机制

Android使用了一个名为Low Memory Killer(LMK)的机制来管理内存,当内存出现不足时,LMK就开始挥舞屠刀杀掉一些进程以获得新的内存空间。

Android有一套独特的进程管理,它会以oom_adj来表示进程的重要性,oom_adj的值越小,则重要性越高,oom_adj的值越大,该进程被系统选中杀掉的可能性越高。

Android默认的进程管理策略

为了更好的评估进程的重要性,Android将进程分为六类,如下所述:

前台进程:oom_adj=0,指正在当前屏幕上显示的进程和一些系统进程,一旦你回到主界面 或切换到其它程序,当前进程变为隐藏进程,前台进程是不会杀掉的;

可见进程:oom_adj=1,可见进程虽然不在前台,但依然可见,如widget、输入法等,这部分进程也非常重要,基本上不可能被杀掉;

次要服务:oom_adj=2,目前正在运行的一些服务,如下载、播放音乐,它们虽然属于次要服务,但与系统息息相关,一般也不会被杀掉;

隐藏进程:oom_adj=7,这个很容易理解,当应用从前台转入到后台后,也就成为隐藏进程了,通常一键清理内存就是清掉这些隐藏进程;

内容提供者:oom_adj=14,没有程序实体,只提供内容供别的程序去用的,比如日历供应节点,显然这类进程最有可能被先杀掉;

空进程:oom_adj=15,有些程序在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些 历史 信息,这类进程无疑是要最先被杀掉的。

Android的内存管理机制非常适合嵌入式系统,能充分发挥出硬件的潜力,当内存越大,它的优势就越明显。

Android手机需要清内存吗?不需要

那么Android手机到底要不要清内存?结论是:不需要!其实这个结论也适用iPhone手机。

手机内存分为两部分,运行内存和存储内存。买手机时,一个型号的手机有很多套餐可以选择,比如6 64GB、4+128GB,前面的4GB,6GB就是运行内存,后者则是存储内存。

占用手机运行内存的主要是手机运行程序时被软件占用的内存,安卓手机的系统会把手机里说有的软件都放在后台运行之中,因为这样开启软件的时候会节约等待启动的时间,除非用户自己去设置关闭开机自动启动软件。

可运行内存一共就那么多,虽然现在新款手机的运行内存不断加大但随着软件的不断更新升级,占用的手机内存也会越来越大,这都是成正比的。为了清理软件占用的内存,安卓手机都会配备“一键清理”的功能去清理运行内存,这样可以使因为占用运行内存过多而变卡顿的手机流畅起来。

而占用存储内存的东西就有很多了,比如软件的数据缓存、微信qq的聊天记录、相册里的照片、下载的音乐视频、短信垃圾、手机随着系统升级,本身系统所占的内存也会越来越大,这些都会占用手机的存储内存。

其中最占用存储内存的就当属照片和微信了。那么该怎么看微信到底占用了多少内存呢?

点开微信中的[我]-[设置]-[通用]-[清理微信存储空间],等待几秒钟后就会显示占了多少内存了,如果你不经常清理,那这个数字一定会让你大吃一惊。然后点击下方的[管理微信聊天数据]清楚就好了。

一般如果是安卓手机的话,如果手机内存较小,很容易出现内存不够用的情况。安卓系统、应用厂商的服务、手机应用等都会占用大量的内存,由于国内手机厂商深度定制的安卓系统,普遍存在全家桶,大量的服务和应用存在自启和连环唤醒情况,大量消耗用户内存,造成手机内存占用过高,严重影响了用户的使用体验。而反观国外很多采用原生安卓系统的手机,虽然内存并不大,但内存的占用率却极低,实际的应用体验却更优秀。所以国内手机厂商的全家桶,是造成手机内存占用率较高的主要原因。一般可以通过手机助手清理内存,禁止应用自启,卸载无用应用等方法解决手机内存占用较多的问题。

国产手机系统全家桶导致手机内存占用过大

由于目前手机的硬件利润较低,很多国内手机厂商都是通过预装应用的方式,提升手机的利润。所以国产手机普遍存在以全家桶的方式,打包预装各种应用和服务,通常会在手机中进行自启,或者连环唤醒,占用了大量的手机内存,严重影响了手机用户的体验。

手机内存占用过高,可以借助手机卫士清理内存

如果手机的内存占用过高,可以借助手机卫士等工具对手机的内存进行清理,对于不常用的手机应用进行卸载,提升手机的运行效率。另外也可以通过禁止手机应用的自启,来提升手机内存的使用效率,但对于手机存在应用连唤醒的情况,是无效的。所以手机卫士或管家,只能暂时解决手机内存占用过高的问题,无法从根本上解决问题。

使用第三方原生安卓系统,可大幅降低手机内存占用

目前的cm等第三方原生安卓系统,一般都不夹带国产手机厂商的全家桶,系统十分纯净,一般对于手机内存的占用都比较小。一般如果条件允许的话,可以刷第三方的原生安卓系统,提升手机内存的使用效率。

cm系统是老手机的救星

华为荣耀畅玩4,搭载的骁龙410芯片,仅配置了1g内存,可以说硬件配置十分渣,运行华为自带emui系统,内存占用极高,基本卡都没办法使用。但刷cm13系统后,竟然满血复活,运行普通应用十分流畅,完全可以当做备用机使用。这也充分说明,很多国产手机在硬件配置方面没有太大瓶颈,主要是国产手机系统的全家桶,占用大量内存,拖慢了整机的速度。

对于手机内存占用过大的问题,主要是由于安装和启动的手机应用较多,特别是很多国产手机的全家桶,占用和消耗了大量的手机内存,影响了手机的使用效率。一般可以通过手机卫士等工具,清理内存,禁止应用自启等方法解决手机内存占用过大的问题。如果想从根本上解决这个问题,更多的还是依靠手机厂商摒弃全家桶,推出类似cm的第三方原生安卓系统。如果条件许可的话,用户也可以刷cm等比较纯净的第三方安卓系统。

关闭一些没必要自动运行的软件,浏览器可以选择无图模式,音乐播放器可以关闭歌手图片显示,视频播放器要时刻的清理缓存,还有软件安装后自动删除安装包, 游戏 停止运行后,手动清理全盘缓存,QQ压缩包,文件管理器中可以找到,格式zip,如果你知道文件夹是哪个软件所有,觉得清理掉不会影响使用,就清理了,你会发现手机内存又多了至少2GB,不信你就试试吧

智能手机的用户有一个无法规避的问题,那就是手机的卡顿问题,造成手机卡顿的因素有很多,内存不足便是其中的一种。为了尽量避免手机出现卡顿的这种情况,部分用户不惜花费重金来购买高内存的手机,但是依然无法完全规避因为内存不足所导致的手机卡顿问题。低内存手机很好理解,为何高内存手机同样也会出现该问题呢?手机中究竟是怎么在使用内存,该如何规避因为内存不足而导致手机卡顿的这种问题呢?

关于手机内存您又了解多少呢,我们先单纯的从技术面来简单的聊聊这个问题。手机内存可以分为两大类,一类是运行内存,一类是存储内存。前者相当于电脑中的内存,内存空间越大同时支持的运行程序也就越多,较为常见的运行内存有6G、8G、12G等,甚至一些旗舰机型也支持32G的运行内存;后者相当于电脑中的硬盘,内存空间越大意味着能够存储更多的内容资源,包括下载的程序、照片、音频、视频等,较为常见的存储内存有64G、128G、256G等,甚至一些旗舰机型也推出了512G以上的存储内存。

手机厂商标称的内存大小是否与我们实际使用的空间相同呢?

前不久岳云鹏也因为在微博上提出了这个问题而上了热搜!岳云鹏购买了一款128G的手机,但是实际能够使用的空间仅为112G,不仅发出了手机内存难道也存在“公摊面积”的疑问。无论是运行内存也好,还是存储内存也罢,手机厂商采用的进制计算方式与系统不同,导致存在一定的偏差问题(一个采用的是1000进制,一个采用的是1024进制)。除了进制的问题外,手机内存还要被其他内容所占用,例如运行内存开机之后的系统进程占用,通常可供用户使用的运行内存仅为总运行内存的一般,存储内存需要安装操作系统,系统的默认软件等。

排除了这些基本因素外,再来说说智能手机剩余内存为何会容易占满的问题。

先来说说运行内存容易占满的问题(因为运行机制的不同,这里主要讨论的是安卓手机,苹果手机很少会出现此类问题),主要的原因在于智能软件的自行唤醒功能。智能手机现在所使用的软件大部分为免费软件,主要依靠用户流量所带来的广告收益盈利。无论是前台还是后台,软件运行才是获得收益的前提,很多软件或者是同厂软件在没有获得用户同意的前提下,会悄悄地自动进行唤醒,悄然运行在用户的运行内存中,势必会导致用户运行内存逐渐占满。工信部为此也拟定了个人用户信息保护征求意见稿,未经用户许可的前提下,APP软件不得自行唤醒或者更新。

那么,存储内存就是是何原因会逐渐占满呢?

手机硬件的提升势必会带来更大的资源占用,举一个简单的例子,现在供用户手机拍照高清摄像头成为了发展趋势,之前一张照片或许仅为4M左右,现在一张照片将在20M以上,对于存储的需求也越来越高。除此之外,出于个人信息安全的角度考虑,很多APP软件并不会在服务器端存储用户的个人数据,这一数据存储在用户的智能手机存储内存,例如大家较为常用的微信、QQ等,随着时间的推移,您会发现此类程序占用的空间越来越高!

对于运行内存,我们可以通过设置、优化运行程序来降低其占用率,确保手机不会因此而卡顿。不同品牌的手机都会自带内存优化工具,以我手上的三星手机为例,可以在智能管理器、内存选项中查看当前的使用状态,并且可以根据系统的提示进行内存优化。另外在手机设置、程序管理中,大家可以对具体的某款应用程序进行设置,关闭其后台自动唤醒的功能。对于手机操作并不是十分熟悉的用户,可以下载三方手机优化软件来自动对运行内存进行优化,不过个人并不建议如此操作,毕竟三方软件也要耗费手机硬件资源。

对于存储内存,只能够是删除不必要的数据进行优化。合理利用云存储是个不错的方法,无论是手机自带,还是三方云存储都能够缓解我们存储内存的压力(只要能够连接网络,有需求的数据直接从云端下载即可)。对于微信、QQ此类占据空间的程序,只能够通过删除内容的方式来降低空间,为了方便也可以直接卸载、重新安装来释放空间。为了避免关键数据出现丢失,卸载之前可以将数据导致电脑端进行存储,各款软件基本上都提供了由手机向电脑进行数据迁移的功能。

关于手机内存总是不够用的问题,是否也发生在您的手机上呢,最终又是如何解决的呢?欢迎大家留言讨论,分享经验。

手机占用内存最大的就是系统和软件,系统方面你可以通过刷机来改变大小,可以在手官网(或者其他大神资源)找一个自己机型的精减刷机包, 软件方面你可以在安智市场里面下载 历史 版本,较小的软件包可以减轻手机内存压力,另外你还可以root手机,root后可以禁止软件自启,阻止软件相互唤醒,删除不需要的系统软件,一星期左右可以关机一次,彻底释放内存。

【手机总是容易满内存,到底什么占内存?】

手机的内存我们在这里一般称为手机存储数据的空间。一般它类似于电脑的硬盘,手机的内存基本上能够给我们带来的好处是让我们手机能够安装更多的数据,存放更多的文件,不会因为手机内存的不足影响手机的流畅,让手机卡顿。

我们在使用手机的过程中确实会担心手机的内存不足,在我们手机内存不足的情况下,我们会建议大家考虑清理一些内存数据,这样子的能够让手机的内存相对比较充足,手机会相对比较流畅。


特别是对于苹果手机来说,苹果手机如果内存不足的话,在日常使用过程中确实会出现非常严重的卡顿问题,手机在内存严重不足的情况下,能够让手机整体体验值相对不高。

那么,手机的内存到底是哪些那种东西呢?

手机的内存一方面指的是手机系统,手机本身的内置软件所占用的空间。也就是手机出产时,它所占据的一部分的空间。这部分空间是固定的,除非是在系统之后升级,可能会有一定空间的变化,基本上是不会改变的。

手机内存另外一方面是我们在使用手机过程中下载的各种APP以及我们存储的各种数据照片,视频图片等等。同样还有我们在使用一些APP的时候会出现的一些缓存数据,特别像微信,它的缓存数据占据空间相对较大。


所以,我们在日常使用手机过程中,一定要注意清除手机APP中的一些缓存,这样能保证手机的内存数据得到更好的使用,不会因为手机内存数据的不足影响手机的流畅。

手机内存分为运行内存(RAM,简称运存)和存储内存(ROMZ)两种。运行内存比较少,手机一般4G和6G居多。存储内存较大,一般16G—512G,其中64G和128G居多。比如一款手机为“6+64G”的内存,就代表着6G的运行内存和64G的存储内存。

运行内存是为手机运行的程序服务的,换句话说,就是储存运行中的程序的这部分内存。手机不像电脑,当你退出一个程序后,这个程序不会直接关闭,而是在后台继续运行。就比如当你在下载一部电影的时候,你返回桌面或者打开其他软件,这部电影还在继续下载。

只有2G运存的安卓机相信不少人都用过,只要后台运行的程序一多,分分钟给你卡到原地爆炸。而反观只有1G运存的苹果却从来不会出现这种情况,这是因为两者的系统运行机制不同。苹果的ios系统对于后台运行的软件有很好的优化,系统只会分少量的资源给后台运行的应用。这样即保证了后台应用的运行,也不会耽误新程序的加载速度。而安卓系统就不同了,对于后台运行的程序没有限制,所以后台一多,马上变卡。

不过现在的安卓系统新增了一个叫Low Memory Killer(LMK)的后台程序管理机制。每当运行内存不足时,LMK都会自动关闭最不重要的后台程序来为新程序腾出运行内存和系统空间。所以现在的安卓机只要你不是开太多程序,4—6G的运行内存不会被占满。

存储内存相信大家更熟悉了,就是用来储存数据的内存。手机中每个文件、软件、图片、视频都需要占用存储内存。而且,随着手机的使用,系统中的垃圾文件会越来越多,更新的软件越来越大,导致内存不够用。在这个一个QQ、微信动辄几个G的时代,32G的手机内存是不够用了。笔者建议大家最好买64G以上的手机,并且定期恢复出厂设置。

设置一下后台最多只同时打开三个或四个应用软件,其实安卓没有必要那么在乎还剩下多少内存,你会发现六个g和四个g内存占用率都是差不多的。都剩下不了多少内存。系统会根据使用习惯把常用软件从rom调入ram中供用户随时快速打来。

Ⅲ LowMemoryKiller机制分析

linux系统当可用内存较低的时候oom killer机制会根据一定的规则去杀掉一些进程来释放内存,而Android系统的LowMemoryKiller机制就是以此功能为基础做了一些调整。Android系统中的APP在使用完成之后并不会马上被杀掉,而是驻留在内存中,当下一次在此进入此应用的时候可以省去进程创建的过程,加快启动速度。LowMemoryKiller机制会在内存资源紧张的时候,杀掉一些进程来回收内存。

LowMemoryKiller机制分为三个部分

Framework中的ProcessList和Native的lmkd进程通过Socket进行进程间通信,而lmkd和内核中的LowMemoryKiller通过writeFileString向文件节点写内容方法进行通信。

Framework层通过一定的规则调整进程的adj的值和内存空间阀值,然后通过socket发送给lmkd进程,lmkd两种处理方式, 一种将阀值写入文件节点发送给内核的LowMemoryKiller,由内核进行杀进程处理,另一种是lmkd通过cgroup监控内存使用情况,自行计算杀掉进程。

lmkd是一个native进程,由init进程启动,定义在/system/core/lmkd/lmkd.rc中

在lmkd.rc中,启动了lmkd进程,并创建了一个名为lmkd的socket的描述符,用于socket进程间通信。lmkd启动后首先执行main方法。

main方法首先设置了当前进程的调度规则,然后执行了init方法和mainLoop方法。

lmkd的init方法中做的工作

我们先分析内核实现的LowMemoryKiller进程查杀机制, 然后再分析lmkd实现的机制。两者最终的结果都是在内存紧张的时候杀死一些进程来释放内存, 但是实现机制去不太一样。

init执行初始化完成之后, 进入mainloop方法,循环等待epoll事件的上报,init的时候epoll监听的socket连接, 当有socket连接的时候就会调用ctrl_connect_handler方法。

监听到socket连接, 我们知道此时连接lmkd的socket客户端就是framework,当有连接到来的时候accept方法返回连接的socketFD, 然后将连接的socketFD同样加入epoll中, 当socketFD中有可读消息,即framework给lmkd发送消息的时候,epoll唤醒然后会掉ctrl_data_handler方法来处理。

Framework和lmkd进程通过socket来进行进程间通信,在lmkd初始化的时候,通过监听socket描述符lmkd来等待Framework发送的消息。
Framework向lmkd发送命令相关的方法有三个。

上面的三种情况Framework最终是通过socket向lmkd发送了三种消息。

lmkd接收命令处理逻辑

lmkd通过epoll监听socket中是否有数据, 当接受的framework发送的socket命令之后,调用ctrl_cmmand_handler方法处理,显示解析socket中的命令和参数,根据对于的命令来调用不同的方法处理。

对于进程查杀有两种实现方式,一种是内核的LMK,通过shrinker来触发低内存回收, 另一种是lmkd通过cgroup监控内存使用情况,自行计算杀掉进程。两种实现不太一样,需要逐个分析。

设置内存阀值和adj的值就是将从framework收到的数据封装成字符串,通过writefilestring写入到两个文件节点,以供内核LMK使用。
/sys/mole/lowmemorykiller/parameters/minfree : 内存级别限额
/sys/mole/lowmemorykiller/parameters/adj :内存级别限额对应的要杀掉的进程的adj值.

由于使用内核LMK, 所以调整进程优先级直接将优先级写入对应进程的oom_adj_score文件即可。

移除进程的时候不需要做任何操作

在linux中,有一个名为kswapd的内核线程,当linux回收存放分页的时候,kswapd线程将会遍历一张shrinker链表,并执行回调,或者某个app启动,发现可用内存不足时,则内核会阻塞请求分配内存的进程分配内存的过程,并在该进程中去执行lowmemorykiller来释放内存。虽然之前没有接触过,大体的理解就是向系统注册了这个shrinker回调函数之后,当系统空闲内存页面不足时会调用这个回调函数。 struct shrinker的定义在linux/kernel/include/linux/shrinker.h中:
内核LowMemoryKiller shrinker的注册过程如下:

注册完成之后, 在内存紧张的时候就会回调shrinker, 其中最主要的是lowmem_scan方法。具体实现如下:

内核LMK的原理很简单:首先注册了shrinker,在内存紧张的时候会触发lowmem_scan方法,这个方法要做的就是找打一个进程,然后杀掉他,释放一些内存。

内核LMK的实现逻辑已经分析完了

lmkd实现内存查实的方式是基于 cgroup memory 来实现的。
什么是cgroup memory?
Cgroup的memory子系统,即memory cgroup(本文以下简称memcg),提供了对系统中一组进程的内存行为的管理,从而对整个系统中对内存有不用需求的进程或应用程序区分管理,实现更有效的资源利用和隔离。

cgroup memory相关的文件

简单的了解了下cgroup的原理,再来看lmkd的init方法

先了解下memory pressure_level的用法

init_mp_common方法严格的按照pressure_level的用法,注册了pressure_level的事件回调, pressure_level分为三个等级

当内存达到相应的等级,就会回调mp_event_common方法, 由mp_event_common方法来处理。

lmkd内存查杀原理:

进程查杀的两种实现方式原理类似,都是注册是的回调,当内存紧张的时候根据剩余内存的adj来查杀大于该adj的内存。内核shrinker方式是只有内存紧张的时候才会去释放,而cgroup方式控制更加精细, 根据不同等级来触发内存回收。

阅读全文

与lmkandroid相关的资料

热点内容
面试题java设计模式 浏览:88
程序员孩子的生活 浏览:776
抖音app的介绍怎么写 浏览:748
老爸评测app怎么下载 浏览:685
上了大学才能做程序员的工作吗 浏览:545
手机能备份加密文件吗 浏览:268
如何注册u8硬加密产品 浏览:997
程序员控制棋牌 浏览:925
python3入门指南 浏览:684
php保存图片路径 浏览:721
python通过搜索抓取网站 浏览:514
程序员代码恶搞500次 浏览:575
服务器白名单命令 浏览:90
小米手机里压缩包是什么能删除么 浏览:144
如何使cmake交叉编译安卓 浏览:812
佳明手表怎么关闭app 浏览:242
php合并数组为字符串 浏览:67
指上解压 浏览:244
橙啦英语app怎么查看时长 浏览:462
云管理服务器哪个好用 浏览:625