Android中的Low Memory Killer

转载请标明出处:

http://blog.csdn.net/yujun411522/article/details/46334123

本文出自:【yujun411522的博客】

在现有的技术条件下,内存永远都是一个吃紧的资源,不用说是PC上会出现内存不足的可能,更不必说在移动设备上了。一旦出现内存不足就会导致系统卡顿,影响用户体验。而Android运行在Linux的基础之上,Linux的内存的使用原则就是不要浪费内存,所以在程序退出时在一段时间内还停留在内存中,这也是我们下一次打开程序时发现快一些的原因;但是这样带来的坏处就是如果驻留在内存中的程序多了,容易导致OOM的可能。

在Linux中有一个内存监控机制OOMKiller,一旦发现内存使用进入一个临界值就会自动按照一定的策略来清理,它的核心思想是:

1 按照优先级,从低到高来杀死进程,回收内存资源

2 一方面要考虑杀死进程给系统带来的损坏要尽量小,另一方面要释放尽量多的内存

具体的做法是OOMKiller会根据一些参考因素如进程消耗内存,运行时间,OOM权重等指标计算出一个oom_score分数,这个分数越低,进程被杀死的概率越小,被杀死的时间越晚。

而对于Android系统来说是实现一个"不同级别"的killer,这个模块名称为Low Memory Killer,代码在drivers/staging/android/LowMemoryKiller.c文件中


 static int __init lowmem_init(void)
 {
         register_shrinker(&lowmem_shrinker);
         return 0;
}
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="text-align: -webkit-auto;">代码中</span><span style="text-align: -webkit-auto;">注册一个shrinker监听器,如果系统空间页面低于一定的阈值,执行这个lowmem_shrinker函数</span></span>

该文件中定义了两个重要的数组:

static int lowmem_adj[6] = {
       0,
       1,
       6,
       12,
 };
static int lowmem_adj_size = 4;
static size_t lowmem_minfree[6] = {
       3 * 512,        /* 6MB */
       2 * 1024,       /* 8MB */
       4 * 1024,       /* 16MB */
       16 * 1024,      /* 64MB */
 };
static int lowmem_minfree_size = 4;

上面定义的两个数组时一一对应的,其中lowmem_adj表示的是被处理某一个级别的adj的值,lowmen_minfree则表示该级别对应的内存阈值。比如说adj=0的级别,它对应的内存阈值是6M,也就是在可用内存小于6M时,会清除adj大于等于0的所有进程。所以可以看出adj越小,它被杀死的可能越小。

上面定义的是系统默认的,可以通过设置相应的文件来修改这两组值:

/sys/module/lowmemorykiller/parameters/adj

/sys/module/lowmemorykiller/parameters/minfree  (以页为单位,一般是4KB大小)

在Android系统中定义了几个adj的值,他的意义分别如下:

这些是系统提供的adj,我们还可以改变自己进程的adj值,有以下两种方式:

1 写文件 写/proc/pid/oom_adj 值,在init.rc文件中就经常看到这种语句

on early-init

write /proc/1/oom_adj -16

设置init进程的adj 值为-16,属于系统进程永远不会被杀死

2 设置persistent属性。

在AndroidManifest.xml文件中设置这个属性为true,即可将其adj的值设置为-12,处于这个级别的进程基本上也不会被杀死,比如电话。

时间: 2024-10-14 22:21:40

Android中的Low Memory Killer的相关文章

Android进程回收机制LMK(Low Memory Killer)【转】

本文转载自:http://www.cnblogs.com/wytiger/p/5744752.html 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来.打开的应用越多,后台缓存的进程也越多.在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app, 这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM K

low memory killer配置的思考

OOM_ADJ对于低内存的时候,我们总是想尽量杀掉background的app,尽量保留persist service(比如输入法),让前台app能够流畅的运行.1,background app的adj尽量设高一些,但是max和mini之前,尽量还是要保留一些差距,这样让系统可以逐步去kill进程,而不是一次杀掉很多.一次杀掉很多app很容易造成系统卡顿.2,previeous app和home launcer的adj一定要独立出来,并且不能设置太低,previous app可能会占用很多的内存

Android 如何将一个app 设置为持久app, 不被low memory kill 关闭

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 如何将一个app 设置为常住app, 不被low memory kill 关闭 [Keyword] app 持久 persistent [Solution] 1. 将app 的manifest.xml 中的 application 中添加属性 android:

Android中如何查看内存

文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813 像Linux这种现代操作系统的内存使用是很复杂的,因此很难准确的知道你的应用程序使用了好多内存. 查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同. 方式一,Running services 通过手机上Running services的Activit

Android中service用法

Service翻译: Class Overview A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each servi

Android中如何查看内存(上)

文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813 像Linux这种现代操作系统的内存使用是很复杂的,因此很难准确的知道你的应用程序使用了好多内存. 查看内存使用的方式有很多种,但是各个方式查看到的结果可能会有微略不同. 方式一,Running services 通过手机上Running services的Activit

Java/Android中的优先级任务队列的实践

版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 刚刚把公司的活干完,去群里水,有几个小伙伴问我怎么实现队列,于是乎我来写一篇吧.本篇文章适用于Java和Android开发者,会从实现一个最简单的队列过渡到实现一个带有优先级的队列,保准你可以掌握基本的队列原理. 队列的基本理解 用生活中的一个情景来举个栗子,前段时间很火爆的电视剧<人民的名义>中有一个丁义珍式的窗口大家应该都知道了,我们不说<人民的名义>也不说丁义珍,我们来说说这个办

关于Android中SparseArray比HashMap性能好的深入研究

由于网上有朋友对于这个问题已经有了很详细的研究,所以我就不班门弄斧了: 转载于:http://android-performance.com/android/2014/02/10/android-sparsearray-vs-hashmap.html http://liuzhichao.com/p/832.html SparseArray是Android框架独有的类,在标准的JDK中不存在这个类.它要比 HashMap 节省内存,某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为

Android 中查看内存的使用情况集常用adb命令

1. 在IDE中查看Log信息 当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下: D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time> GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLOC: