如何修改lowmemorLadykillerr的阙值

Andorid的Low Memory Killer是在标准的linux kernel的OOM基础上修改而来嘚一种内存管理机制当系统内存不足时,杀死不必要的进程释放其内存不必要的进程的选择根据有2个:oom_adj和占用的内存的大小。

oom_adj代表进程的优先级数值越高,优先级越低越容易被杀死;对应每个oom_adj都可以有一个空闲内存的阀值。Android Kernel每隔一段时间会检测当前空闲内存是否低於某个阀值假如是,则杀死oom_adj最大的不必要的进程如果有多个,就根据oom_score_adj去杀死进程直到内存恢复低于阀值的状态。

LowMemorLadykillerr的值的设定主要保存在2个文件之中,分别是:


那么AN是如何计算每个app最终的oom_adj值的呢

oom_adj的范围是[-16, 15],AN根据app进程的特性进行了分类不同的类别,对应不同的数值

  • 2: 用户可感知的后台进程,如:后台背景音乐播放器
  • -12: 常驻内存的系统app--如:系统自带的拨号app。

LMK通过注册shrinker来实现shrinker是Linux kernel标准的回收page的机制,由内核线程kswapd负责监控参见mm/vmscan.c中的kswapd。 当需要分配内存发现可用内存不足时,则内核会阻塞请求分配内存的进程进入slow

这个数组里面就得箌目标oom_adj值,最终在大于等于该目标oom_adj的进程中,杀死拥有最大oom_adj

如果kswapd回收速度小于内存消耗速度内存水位下降到min水位,则direct reclaim开始回收内存並会阻塞应用程序。 内存换出到swap分区的过程:

开始工作的门限值和直接回收(内存分配进程做的)的门限值之间保持额外的free memory 需要低延迟嘚内存分配和在内存分配具有突发性的情况很有用,例如一个实时应用接受 和发送最大的信息可能达到200MB的网络数据(导致内核内存分配),這就需要200MB的额
外的可用内存来避免直接回收内存相关的延迟。-->
  

开发的设备内存比较小总共1G,可用动态分配只有770,952KB
monkey煲机,发现很容易死机log如下

从log看是触发了内除回收,结合出发前剩余内存信息此时可用内存46364KB(此处log未体现),按照lowmemkiller的机制此时的可用内存应该小于最小可鼡内存的阈值,影响了前台进程运行因此触发内存压缩,回收内存但是设备并没有配置内存压缩分区,内存不能再分配因此崩溃。

對应的字节数是(内存页数*4即KB)

剩余内存的确小于了前台进程对应的可用内存阈值73728,触发了内存压缩设备配置内存本来比较小,没有必要把阈值配置的很高由于使用的是默认值,没有做修改也没有打开low_mem,从代码看low_mem打开会牺牲一些性能(实测如此),因此没有打开那麼现在需要修改不同oom_adj对应的可用内存。

这个值不是内存页数单位是KB,因此只有7M通过多次可用内存分析,内存需求波动较大时在20M左右為系统稳定不卡顿运行,该值设置为25M修改config_extraFreeKbytesAbsolute为25600即可。

通过修改后做相同的压测,系统稳定性提高很多已煲机21小时,还在煲机中=^ _ ^=

根据實践和理解源码的计算方式,为方便调试修改源码,通过property配置最终修改方案如下

 
 
 
 
 
 
 
 
 
 
 

根据实际测试,minfreeAbsKbytes太大时产生oom时机较早,此时可用内存较大oom频繁,当无内存可释放时会触发内存压缩;当minfreeAbsKbytes小了,产生oom时机较晚可能系统运行已经不正常。

我们总结一下OOM levels的更新:时机是在系统启动后第一个configuration change的消息到AMS的时候;adj值为一组固定的预定义的值;各个adj所对应的min free阈值则根据系统的内存大小和屏幕的分辨率计算得出,各个设备还可以通过framework的config

我们可以根据系统所吐出来的log看一下事实是否如我们上面对code的分析那样。由某个设备抓到的系统内核吐出来的log鈳以发现如下的这些行(只出现一次):

code的分析基本一致。

打开PS ,点“图像”工具菜单点“圖像大小”,修改宽和高的像素大小(可以锁定宽和高的比例)。用这种方法更改才是更改图片dpi像素大小。

你对这个回答的评价是

丅载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 Ladykiller 的文章

 

随机推荐