- 浏览: 1504600 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
http://blog.csdn.net/rio2012/article/details/6186125
(1)Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因
此为了加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内
存肯定会出现不足,这个时候Android系统开始挥舞屠刀杀程序。这里就有一个很明显的问题,杀谁?
(2)Android系统中杀程序
的这个刽子手被称作"LowMemory
Killer",它是在Linux内核中实现的。这里它实现了一个机制,由程序的重要性来决定杀谁。通俗来说,谁不干活,先杀谁。Android将程序的
重要性分成以下几类,按照重要性依次降低的顺序:
名称 | oom_adj | 解释 |
FOREGROUD_APP | 0 | 前台程序,可以理解为你正在使用的程序 |
VISIBLE_APP | 1 | 用户可见的程序 |
SECONDARY_SERVER | 2 | 后台服务,比如说QQ会在后台运行服务 |
HOME_APP | 4 | HOME,就是主界面 |
HIDDEN_APP | 7 | 被隐藏的程序 |
CONTENT_PROVIDER | 14 | 内容提供者, |
EMPTY_APP |
15 |
空程序,既不提供服务,也不提供内容 |
其中每个程序都会有一个oom_adj值,这个值越小,程序越重要,被杀的可能性越低。
(3)除了上述程序重要性分类之外,Android系统还维护着另外一张表,这张表是一个对应关系,以N1为例:
oom_adj | 内存警戒值( 以4K为单位) |
0 | 1536 |
1 | 2048 |
2 | 4096 |
7 | 5120 |
14 | 5632 |
15 | 6144 |
这个表是定义了一个对应关系,每一个警戒值对应了一个重要性值,当系统的可用内存低于某个警戒值时,就杀掉所有大于该警戒值对应的重要性值的程序。
比如说,当可用内存小于6144 * 4K = 24MB时,开始杀所有的EMPTY_APP,当可用内存小于5632 * 4K =
22MB时,开始杀所有
的CONTENT_PROVIDER和EMPTY_APP。
(4) alter minfree改的是什么呢,上面这张对应表是由两个文件组成的:
/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree。
alter minfreee就是修改/sys/module/lowmemorykiller/parameters/minfree这个文件的,举例来说,如果把最后一项改为32 * 1024,那么当可用内存小于128MB是,就开始杀所有的EMPTY_APP。
评论
基本原理:
Android的Low Memory Killer是在标准linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存。Bad进程的选择标准有两个:oom_adj和占用内存的大小。oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阈值。Android Kernel每隔一段时间会检查当前空闲内存是否低于某个阈值,如果是,则杀死oom_adj最大的Bad进程,如果有两个以上Bad进程oom_adj相同,则杀死其中占用内存最多的进程。
Low Memory Killer与OOM的区别
OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:
OOM基于多个标准给每个进程打分,分最高的进程将被杀死;Low MemoryKiller则用oom_adj和占用内存的大小来选择Bad进程,OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。
Low Memory Killer的实现
Low Memory Killer的源代码在drivers/staging/Android/lowmemorykiller.c中,它是通过注册Cache Shrinker来实现的。Cache Shrinker是标准linux kernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,kswapd会调用注册的Shrinker回调函数,来回收内存页面。
Low Memory Killer是在模块初始化时注册Cache Shrinker的,代码如下:
static int__init lowmem_init(void)
{
register_shrinker(&lowmem_shrinker);//注册Cache Shrinker
return 0;
}
lowmem_shrinker的定义如下:
static struct shrinker lowmem_shrinker=
{
.shrink=lowmem_shrink,
.seeks=DEFAULT_SEEKS*16
};
register_shrinker会将lowmem_shrink加入Shrinker List中,被kswapd在遍历Shrinker List时调用,而Low Memory Killer的功能就是在lowmem_shrink中实现的。
lowmem_shrink用两个数组作为选择Bad进程的依据,这两个数组的定义如下:
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
};
lowmem_minfree保存空闲内存的阈值,单位是一个页面4K,lowmem_adj保存每个阈值对应的优先级。lowmem_shrink首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。
lowmem_shrink杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL信号:
force_sig(SIGKILL,selected);
用户接口
设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口:/proc/<进程pid>/oom_adj。
Android启动时读取的配置文件/init.rc中定义了相应的属性供AP使用并有设置这些参数:
#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.BACKUP_APP_ADJ 2
setprop ro.HOME_APP_ADJ 4
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.BACKUP_APP_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
#Write value must be consistent with the above properties.
#Note that the driver only supports 6 slots,so we have HOME_APP
at the
#same memory level as services.
write/sys/module/lowmemorykiller/parameters/adj
0,1,2,7,14,15
write/sys/module/lowmemorykiller/parameters/minfree
1536,2048,4096,5120,5632,6144
#Set init its forked children's oom_adj.
write/proc/1/oom_adj-16
从以上设置可以看出,将init进程oom_adj设置为-16,从而保证init进程永远不会被杀掉
发表评论
-
[Android] 为Android安装BusyBox —— 完整的bash shell
2013-12-27 10:19 1490http://www.cnblogs.com/xiaowen ... -
Windows的adb shell中使用vi不乱码方法及AdbPutty
2013-12-27 10:17 7576http://www.veryhuo.com/down/ht ... -
AppMobi推出新XDK,可创建测试PhoneGap项目
2012-09-03 13:39 2637AppMobi今天发布了一个新的工具PhoneGap Mobi ... -
Sencha
2012-09-03 12:59 1185http://www.sencha.com/ Se ... -
jQuery Mobile学习
2012-09-01 12:33 1691使用Jquery Mobile设计Android通讯录 ... -
BackBone
2012-09-01 12:34 1260Backbone.js 是一种重量级javascript M ... -
jQTouch
2012-08-30 15:57 984A Zepto/jQuery plugin for mobil ... -
SwiFTP
2012-08-30 15:43 1307SwiFTP is a FTP server that run ... -
kWS
2012-08-30 15:41 1198kWS is a lightweight and fast W ... -
jQuery Mobile
2012-08-30 15:07 1027http://jquerymobile.com/ -
PhoneGap
2012-08-30 15:07 1044http://phonegap.com/ -
Android Button background image pressed/highlighted and disabled states without
2012-08-06 12:49 1678http://shikii.net/blog/android- ... -
[AndriodTips]Image, saved to sdcard, doesn't appear in Android's Gallery app
2012-08-04 16:15 1158http://stackoverflow.com/questi ... -
Voice detection for Android
2012-07-23 11:39 2347Here it is, my fist JAVA applic ... -
[AndroidTip]local reference table overflow (max=512)的错误解决
2012-07-22 22:56 6049JNI层coding经常会遇到ReferenceTable o ... -
[AndroidTip]EditText如何初始状态不获得焦点?
2012-07-22 15:35 1226最简单的办法是在EditText前面放置一个看不到的Linea ... -
[AndroidTip]android textview滚动条
2012-07-21 14:29 1298本来是想做一个显示文字信息的,当文字很多时View的高度不能超 ... -
Google公布Android 4.1完整功能
2012-07-16 09:48 3185http://www.android.com/about/je ... -
Android开发:使用AudioTrack播放PCM音频数据【附源码】
2012-07-13 15:20 20867http://www.linuxidc.com/Linux/2 ... -
Android上的行车记录仪
2012-07-11 22:31 2010MyCar Recorder DailyRoads
相关推荐
LowMemoryKiller(低内存杀手)是Android内核中一种独特的内存管理机制,它在标准Linux内核的Out-of-Memory(OOM)机制基础上进行了改良,专门设计用于应对Android设备在运行过程中可能遇到的内存紧张情况。...
Low Memory Killer 提供了三个用户接口,分别是设置空闲内存阈值的接口 /sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口 /sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的...
**LowMemoryKiller** 是 Android 内核中的一个重要组件,用于管理设备内存,特别是当系统面临内存压力时,通过合理地终止某些进程来释放内存资源。这一机制基于 Linux 内核中的 OOM(Out Of Memory)机制进行改进,...
Android系统的内存管理机制是其高效运行的关键之一。Android内核基于Linux 2.6,它包含了一系列特定于Android平台的设备驱动,如Android Binder用于进程间通信,电源管理驱动优化了嵌入式设备的电源使用,以及低内存...
LowMemoryKiller是一种在标准Linux内核的OOM(Out of Memory)机制基础上改进而来的内存管理机制。当系统检测到内存压力过大时,LowMemoryKiller会自动识别并终止那些占用大量内存但又不是特别重要的进程,从而释放...
Android内存回收机制策略 1、GC 2、lowmemorykiller GC GC是java虚拟机的内存...OOM(Out Of Memory) : Android内存管理机制及优化方法(https://www.2cto.com/kf/201805/741791.html) 简言之,即应用占用的最大内存
同时,Android 3.0还引入了低内存杀手(Low Memory Killer)机制,当系统内存不足时,它会选择优先级较低的进程进行杀掉,以保证关键服务的正常运行。 另外,Android 3.0内存管理还包括了内存泄漏检测和预防策略,...
LMK的实现位于`drivers/staging/Android/lowmemorykiller.c`,它通过注册为Cache Shrinker来参与内存回收过程。在内存不足时,内核线程kswapd会调用注册的Shrinker回调函数,即`lowmem_shrink`,以回收内存页。 2. ...
1. LMK(Low Memory Killer)机制:安卓系统通过LMK机制管理内存使用。当系统内存低于一定阈值时,LMK会按照优先级杀死一些后台进程来释放内存。这保证了前台应用能够获得足够的内存资源,提升用户体验。 2. 内存...
而Low Memory Killer则是一种内存管理机制,用来在系统内存紧张时自动关闭一些后台进程。 在Linux内存管理中,还涉及到Overcommit的概念,这是Linux系统对于内存分配的一种策略。简而言之,Overcommit允许系统分配...
其内存管理机制是确保系统流畅运行的关键之一。不同于传统的Linux OOM(Out Of Memory)杀手机制,Android采用了一套更为精细的低内存管理策略,旨在平衡应用性能与系统稳定性。 #### 二、LOWMEMORYKILLER深入解读 ...
文档介绍了drop_cache和lowmemorykiller两个重要的内存管理机制。 - **drop_cache机制**:Linux会将大部分空闲内存用于文件系统缓存,而这可能导致系统空闲内存不足,影响系统效率。drop_cache机制能够定期回收文件...
优化内存的目标在于防止应用出现Out of Memory (OOM)错误,降低由于内存过大导致应用被Low Memory Killer (LMK)机制杀死的风险,减少由于不合理内存使用引发的垃圾收集(GC)次数,进而避免应用卡顿。同时,优化内存...
因此,Android引入了一种专门针对低内存情况的管理机制——LMK(Low Memory Killer)。 **1.3.1. Android 系统特点** Android系统的运行环境较为复杂,它需要支持各种类型的应用程序,同时还要保证用户体验的流畅性...
源代码位于 drivers/staging/android/lowmemorykiller.c。 Low Memory Killer 是 Android 中的一种内存管理机制。当系统内存不足时,它可以杀死一些进程以释放内存,从而确保系统的稳定性。 4. 匿名共享内存...
在Android开发过程中,"Out Of Memory"(OOM)错误是一个常见的问题,特别是在处理大量数据、图像或者长时间运行的任务时...总的来说,理解Android内存管理机制并采取有效的内存优化策略,是防止和解决OOM问题的关键。
总体来看,LowMemoryKiller是一种专门针对Android系统设计的内存管理机制,它能够在内存资源紧张时有效地释放内存,从而提高系统的整体稳定性。虽然LMK与标准Linux内核中的OOMKiller在设计理念上有很多共通之处,但...