android低内存管理策略

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android低内存管理策略

.

Revision History

Date Issue Description Author

<11/29/2011> <0.1> android低内存管理策略兰琮

© Tech, 2008 Page 1 of 14

目录

1.ANDROID内存管理简介 (3)

2.LOW MEMORY KILLER介绍 (4)

2.1基本原理 (4)

2.2L OW M EMORY K ILLER与OOM的区别 (4)

2.3L OW M EMORY K ILLER的实现方式 (4)

2.4用户设置的接口 (5)

3.如何计算各进程的ADJ值? (6)

几种查看进程内存的方法:: (9)

4.几种查看进程内存的方法

4.1TOP命令 (9)

4.2CAT PROC/MEMINFO (9)

4.3PS命令 (11)

4.4PROCRANK命令 (11)

4.5DUMPSYS MEMINFO命令 (12)

5.ANDROID中设置中的可用内存的由来 (12)

© Tech, 2008 Page 2 of 14

1. android内存管理简介

android按照进程的重要性,将进程分为6部分,如下图,重要性依次降低。

台进程((foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer

1.前台进程

Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。

2.可见进程

可见进程((visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)

次要服务((secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被3.次要服务

进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也不太希望他们被终止

后台进程((hidden):虽然作者用了hidden这个词,但实际即是后台进程(background),就4.后台进程

是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点

内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如日历供5.内容供应节点

应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权

6.空进程

空进程((empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或

© Tech, 2008 Page 3 of 14

者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。

大家知道android是基于linux的,linux的内存管理方式是OOM方式的,但是android的内存管理和linux的不同,linux的进程一旦进程活动结束就结束进程,回收内存,但是android是嵌入式系统,要考虑到应用启动的频繁和嵌入式系统内存,CPU不够强悍的原因,android并不马上结束进程,而是将这些进程保存到内存中,如果你的手机内存足够,会发现你的内存越来越少。直到你启动一个比较消耗内存大的应用,这个时候android的内存管理才会启动自已的优先级策略,杀掉一些他认为的优先级不高和内存阀值太多的应用(low memroy killer策略),平时这些在后台的应用程序只是保存在内存中,只保留了下次启动时所必须的一些变量值,并不在后台运行,即是不占用CPU资源(这个和WINDOWS的应用有很大区别),因此基于这个原理可以说市场上的android的一些后台管理杀进程的软件本身是没有必要的,是违背android的内存设计原理的。杀进程软件只会使得启动新应用更慢,并且耗费额外的CPU资源和其他资源,得不偿失。

2. Low Memory Killer介绍

2.1 基本原理

Android的Low Memory killer是在标准的linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存,Bad进行的选择标准有2个:oom_adj和占用内存的大小,oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阀值。系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程。Android Kernel每隔一段时间会检查当前内存是否低于某个阀值,如果是,则杀死oom_adj最大的Bad进程,如果有2个以上的Bad进程oom_adj相同,则杀死其中占用内存最多的

2.2 Low Memory Killer与OOM的区别

OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:

基于多个标准给每个进程打分,分最高的进程将被杀死;Low Memory Killer则用oom_adj和占用内存的大小来选择Bad进程。

OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。

2.3 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的,代码如下:

© Tech, 2008 Page 4 of 14

相关文档
最新文档