LowMemoryKiller

adb命令:

>adb root
restarting adbd as root>adb shell cat sys/module/lowmemorykiller/parameters/minfree
18432,23040,27648,32256,55296,80640>adb shell cat sys/module/lowmemorykiller/parameters/adj
0,100,200,300,900,906

对于这两个文件的理解,其实质上是配合使用的,minfree里面的数字是表示内存剩余大小80640表示80640*4/1024=315M,而adj中的则表示进程对应的优先级;

即:当内存不足低至315M时,系统就会杀掉进程优先级大于906的进程;

如何查看每个进程的优先级呢?
方案1:
dumpsys activity processes |grep -e set= -e ‘* UID’
可获取如下 结果,其中set值即为adj值
APP UID 10035 ProcessRecord{99ade8b 16686:android.process.acore/u0a35}
oom: max=1001 curRaw=902 setRaw=902 cur=902 set=902
APP UID 10018 ProcessRecord{714580f 2907:android.process.media/u0a18}
oom: max=1001 curRaw=902 setRaw=902 cur=902 set=902
方案2:

通过命令adb shell ps 或者adb shell ps |findstr 进程pid 的方式,可以查看所有进程\指定进程的pid

在系统目录 /proc/下,会有每个进程的文件夹

以进程pid=2528为例,

proc/2528 # ls |grep oom
oom_adj (代表进程的优先级, 数值越大,优先级越低,越容易被杀. 取值范围[-16, 15])
oom_score ( lmk策略中没有看到使用的地方,应该是oom才会使用。 要想提高进程优先级,尽量避免自己被杀,那就得提高进程的oom_score_adj)
oom_score_adj (取值范围[-1000, 1001] ,该值就是AMS设置过来的值, 值定义见ProcessList.java )

高版本的内核都不在使用oom_adj,而是用oom_score_adj,oom_score_adj是一个向后兼容。

综上所述,oom_score_adj 对应的之前提到的kill进程的优先级

adb shell cat sys/module/lowmemorykiller/parameters/adj
0,100,200,300,900,906

  1. 若要获取所有进程的adj值,可观察proc下文件类型,根据需求,若要杀应用进程,一般只需要查看四位数字的文件夹即可。

  2. 考虑到proc下文件系统访问需要root权限(在此我们默认为系统源码级开发),我们可以用shell脚本来执行获取数据。

  3. shell脚本放哪呢? 通过查看系统文件,发现vendor/bin和system/bin下有很多sh文件,于是,我们可以把sh文件放在更容易操作的system/bin目录下

  4. sh文件如何执行呢?我们把sh文件命名为adj.sh. 可以简单的通过adb命令来执行,adb shell adj.sh,作为代码实现执行,可以通过创建rc文件,在rc文件中定义,写系统属性的时候,执行sh。

adj.sh 可参考如下示例,根据需求进行修改

解释如下:

  1. 在sdcard下创建临时文件adj_temp_result.txt
  2. 将开始和结束时间写入文件的开头和结尾,以便查看本次命令执行开始时间和耗时
  3. 通过执行ls /proc/[0-9]???/oom_score_adj 的方式,获取所有四位id 的oom_score_adj 路径
  4. 遍历以上路径,输出oom_score_adj 值和路径,每行格式如:-800/proc/1947/oom_score_adj,从整个文件获取列表,每行第一位是oom_score_adj 值,第三位是pid值。
  5. echo输出到文件时,单个>清除文件内容,从文件开头写入,>>代表追加内容到文件尾
#!/bin/sh
touch /sdcard/adj_temp_result.txt
current_time=$(date "+%Y-%m-%d %H:%M:%S.sss")
echo $current_time>/sdcard/adj_temp_result.txt
for line in $(ls /proc/[0-9]???/oom_score_adj)
doecho $(cat $line)/$line >>/sdcard/adj_temp_result.txt
done
current_time=$(date "+%Y-%m-%d %H:%M:%S.sss")
echo $current_time>>/sdcard/adj_temp_result.txt

rc和sh的使用

Android.mk 中添加

LOCAL_INIT_RC := adj.rc
$(shell cp -f $(LOCAL_PATH)/adj.rc $(PRODUCT_OUT)/system/etc/init/)
$(shell cp -f $(LOCAL_PATH)/adj.sh $(PRODUCT_OUT)/system/bin/)

adj.rc 如下, 设置系统属性vendor.zw.adj=1 时,执行设为root权限的adj.sh

on property:vendor.zw.adj=1start adj-sh#delete log client
service adj-sh /system/bin/adj.shclass mainuser rootgroup rootdisabledoneshot

以上cp命令也可放在增删模块的mk文件中添加

PRODUCT_COPY_FILES +=
packages/apps/xxx/adj.sh:KaTeX parse error: Undefined control sequence: \ at position 37: …EM)/bin/adj.sh \̲ ̲ package…(TARGET_COPY_OUT_SYSTEM)/etc/init/adj.rc

此外,还需要配置adj.sh 的selinux 权限,请参照工程源码中的其他例子
修改file_contexts 和自己新增的te文件

LowMemoryKiller 的使用相关推荐

  1. android的oomkiller_Android分析之LowMemoryKiller

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存. 那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low mem ...

  2. Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

    本篇是Android后台杀死系列的第三篇,前面两篇已经对后台杀死注意事项,杀死恢复机制做了分析,本篇主要讲解的是Android后台杀死原理.相对于后台杀死恢复,LowMemoryKiller原理相对简 ...

  3. 内存泄露Lowmemorykiller分析

    01 前言 最近疫苗事情非常火热,这件事情让我对刘强东有点刮目相看,我们需要更多的人关注曝光此类问题 02 正文 Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存.Low m ...

  4. Android 系统(222)---Android 的lowmemorykiller机制

    Android 的lowmemorykiller机制 转自:http://blog.csdn.net/u012440406/article/details/51960387 最近在处理一些lowmem ...

  5. Android 系统性能优化(40)---Android LowMemoryKiller原理分析

    frameworks/base/services/core/java/com/android/server/am/ProcessList.java platform/system/core/lmkd/ ...

  6. Android 6.0的lowmemorykiller机制

    最近在处理一些lowmemorykiller相关的问题,于是对lowmemorykiller机制作了一个简单的了解.在这里总结一下. 首先,是lowmemorykiller的一些背景知识. 众所周知, ...

  7. Android 进程回收之LowMemoryKiller原理篇

    在前面的文章Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及.LowMemoryKiller简称低内存杀死机制.简单来说,LowMemoryKiller(低内存杀手 ...

  8. Android LowmemoryKiller机制

    为什么引入LowmemoryKiller? 进程的启动分冷启动和热启动,当用户退出某一个进程的时候,并不会真正的将进程退出,而是将这个进程放到后台,以便下次启动的时候可以马上启动起来,这个过程名为热启 ...

  9. 【android】进程优先级(Framework设置优先级,LowMemoryKiller查杀)

    static  final  int  NATIVE_ADJ = -17; static  final  int  SYSTEM_ADJ = -16;   //  系统进程 (init + syste ...

  10. Android LowMemoryKiller ADJ原理

    参考一 参考二 参考三

最新文章

  1. 【CyberSecurityLearning 27】扫描与密码爆破
  2. 又拍云php表单,又拍云的表单api提交
  3. 瞧瞧,这样的代码才叫 Pythonic
  4. HTML5截取视频第一帧作为预览图片
  5. 考研数学预热(肖老师)-2019-12-21
  6. vs2015配置python环境_IronPython | VS2015 开发环境配置
  7. 软件资源学生优惠合集
  8. js设计模式-状态模式-示例(高压锅状态)
  9. 【檀越剑指大厂--网络安全】网络安全学习
  10. office2016专业增强版语言包 VOL
  11. 教育类小程序APP开发
  12. Python gdal库读取tif文件
  13. 目前计算机常用的硬盘类型,干货大放送,电脑硬盘分类你知道几个?
  14. RHCE-8-管理变量和事实/任务控制
  15. 攻击JavaWeb应用[3]-SQL注入[1]
  16. 计算机电脑显示器都有多大的,电脑显示器买多大的合适
  17. python环境-基于go-cqhttp-简易qq聊天机器人
  18. 沟通CTBS V5.0确保立白集团核心数据万无一失
  19. 中医文化的管理学启示
  20. 【数字信号处理】 Unfolding(展开技术)

热门文章

  1. 星门跳跃-rqnoj-341
  2. 全球研究:持续绩效管理可提高竞争优势
  3. H5页面视觉效果设计技巧有哪些
  4. 练习题目---光照度
  5. 获取ftp服务器文件,ftp获取服务器文件
  6. ES6(十八)Module
  7. 古诗词在线起名 - 一刀工具箱
  8. /node_modules/.bin/vue-cli-service: Permission denied
  9. 深入理解JNINativeInterface函数<一>
  10. 4 篇 NAR | 生物大数据时代,如何做好数据管理和再利用,发IF10+的数据库文章?...