该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。 那么,如何来判断,那些进程是需要杀死的呢?答案就是我们的标题:Low memory killer机制。

Low memory killer 则是定时进行检查。Low memory killer 主要是通过进程的oom_adj 来判定进程的重要程度。这个值越小,程序越重要,被杀的可能性越低。oom_adj的大小和进程的类型以及进程被调度的次序有关。Low memory killer 的具体实现可参看:kernel/drivers/misc/lowmemorykiller.c 1.oom_adj的值是如何赋予的

进程的类型,可以在ActivityManagerService中清楚的看到: static final int EMPTY_APP_ADJ; static final int HIDDEN_APP_MAX_ADJ; static final int HIDDEN_APP_MIN_ADJ; static final int HOME_APP_ADJ; static final int BACKUP_APP_ADJ; static final int SECONDARY_SERVER_ADJ; static final int HEAVY_WEIGHT_APP_ADJ; static final int PERCEPTIBLE_APP_ADJ; static final int VISIBLE_APP_ADJ; static final int FOREGROUND_APP_ADJ; static final int CORE_SERVER_ADJ = -12; static final int SYSTEM_ADJ = -16; ActivityManagerService定义各种进程的oom_adj,CORE_SERVER_ADJ代表一些核心的服务的omm_adj,数值为-12,这类进程永远也不会被杀死。其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的:

在init.rc中:

# Define the oom_adj values for the classes of processes that can be# killed by the kernel. These are used in ActivityManagerService. setprop ro.FOREGROUND_APP_ADJ 0 setprop ro.VISIBLE_APP_ADJ 1 setprop ro.SECONDARY_SERVER_ADJ 2 setprop ro.HIDDEN_APP_MIN_ADJ 7 setprop ro.CONTENT_PROVIDER_ADJ 14 setprop ro.EMPTY_APP_ADJ 15 # Define the memory thresholds at which the above process classes will# be killed. These numbers are in pages (4k). setprop ro.FOREGROUND_APP_MEM 1536 setprop ro.VISIBLE_APP_MEM 2048 setprop ro.SECONDARY_SERVER_MEM 4096 setprop ro.HIDDEN_APP_MEM 5120 setprop ro.CONTENT_PROVIDER_MEM 5632 setprop ro.EMPTY_APP_MEM 6144

配置文件有如下两个:

/sys/module/lowmemorykiller/parameters/adj

/sys/module/lowmemorykiller /parameters/minfree

owmeme_adj中各项数值代表阈值的警戒级数,

lowmem_minfree代表对应级数的剩余内存。

adj文件存放着oom_adj 内存警戒值( 以4K为单位) 0 1536 1 2048 2 4096 7 5120 14 5632 15 6144

也就是说,当系统的剩余内存为小于6MB时候,警戒级数为0,当系统内存剩余小于8M而大于6M的时候,警戒级数为1,当内存小于64M大于16MB的时候,警戒级数为12.

对于某些小内存设备,我们可以调整对应的门限值,例如:一般调整后三个值。echo “1536,2048,4096,15360,17920,20480〃>/sys/module/lowmemorykiller/parameters/minfree

原文作者:AndyTsui

原文链接:http://blog.csdn.net/AndyTsui/archive/2011/02/27/6210653.aspx

2.LMK的工作机制

LMK开始工作时,首先根据阈值表确定当前的警戒级数,则高于警戒级数的进程是待杀的范围。然后遍历所有进程的oom_adj值,找到大于min_adj的进程,若找到多个,则把占用进程最大的进程存放在selected中。最关键的一步就是,发送SIGKILL信息,杀掉该进程。

3.tips (1)在init.rc中配置:# Write value must be consistent with the above properties. write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15 write /proc/sys/vm/overcommit_memory 1 write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144 class_start default(2)进程oom_adj同样可以进行设置,通过write /proc//oom_adj ,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。 # Set init its forked children's oom_adj. write /proc/1/oom_adj -16

(3)dumpsys activity可以dump进程的信息,查看adj值 procrank可以查看进程占用内存大小

android的oomkiller_Android分析之LowMemoryKiller相关推荐

  1. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  2. android挂载usb设备,android usb挂载分析---MountService启动

    在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...

  3. Android源码分析-全面理解Context

    前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...

  4. Android Studio +MAT 分析内存泄漏实战

    点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...

  5. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  6. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  7. android settings源代码分析(2)

    通过前一篇文章  Android settings源代码分析(1)  分析,大概知道了Settings主页面是如何显示,今天主要分析"应用"这一块google是如何实现的. 应用对 ...

  8. Android `AsyncTask`简要分析

    Android `AsyncTask`简要分析 AsyncTask简要分析 经典异步任务:AsyncTask,使用场景有:批量下载,批量拷贝等.官方文档就直接给出了一个批量下载的示例. private ...

  9. 转 android anr 分析示例,[摘]Android ANR日志分析指南之实例解析

    前文<[摘]Android ANR日志分析指南>也摘抄了如何分析,接下来通过实例解析. 一.主线程被其他线程lock,导致死锁 waiting on <0x1cd570> (a ...

最新文章

  1. transformer bert seq2seq 深度学习 编码和解码的逻辑-重点
  2. crt证书iis 中引用 程序目录提示 System.UnauthorizedAccessException:拒绝访问
  3. Python的闭包和装饰器
  4. 超级计算机 任务提交,vasp在超算中心的任务提交 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  5. shell中判断空字符串和有趣的空字符串
  6. python代码基础题-Python初学者福利 完整试题附答案 干货(收藏篇)
  7. python-map函数
  8. 粘包问题,以及在python中如何调用操作系统命令
  9. ChildTuning:试试把Dropout加到梯度上去?
  10. 第三方免费开放API 获取用户IP 并查询其地理位置
  11. jdk自带常用命令行工具使用
  12. 软件工程 - 版本管理 - git 的基本实用方法 - 添加一个完整的项目目录的命令的细微差别
  13. %1$s %1$d Android string
  14. 最新eclipse国内镜像站,比ustc等站点资源新。
  15. 2021宇哥八套卷总结—第一套试卷分析
  16. k-anonimity、l-diversity 和 t-closeness
  17. grep -A -B -C -a -c -n -v -i等
  18. CGAL Arrangements and Their Applications: A Step-By-Step Guide
  19. python123m与n的数学运算_【Python数学面试题】面试问题:Python“… - 看准网
  20. 【ESD专题】ESD和EOS有什么差异?

热门文章

  1. 【Android】4.3 屏幕布局和旋转
  2. Ruby 2.2.0发布,支持增量式垃圾收集和符号的垃圾收集
  3. seajs学习心得和新产品福利
  4. LeetCode周赛191
  5. 通过maven命令将源代码编译成jar到本地仓库
  6. Invalid bound statement (not found): com.xsw.dao.CategoryDao.getCategoryById] with root cause
  7. webpack is not defined
  8. kubernetes组件
  9. python 基础学习3-函数
  10. gradle第二天(Building a RESTful Web Service)