android进程调度 内存管理.docx
- 文档编号:10095582
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:19
- 大小:41.91KB
android进程调度 内存管理.docx
《android进程调度 内存管理.docx》由会员分享,可在线阅读,更多相关《android进程调度 内存管理.docx(19页珍藏版)》请在冰豆网上搜索。
android进程调度内存管理
android内存管理机制
(一)
无意中在MIUI看到的文章,感觉不错,转了过来。
原文如下:
最近看到很多机油发帖抱怨内存太小进程杀不掉。
首先要表示,这个帖子是从XX贴吧转来的,主要针对正常的安卓机,像里程碑这种悲剧的小内存机器,我会另外写一篇帖子告诉MS的机油们如何将MS用得很流畅,开机全杀100+毫无压力。
有很多同学表示,自己的机子开机内存怎么只有200m啦,用一会怎么就变成100多m啦,怎么有很多程序在后台关都关不了啦。
首先你要知道Android系统是基于Linux2.6内核开发的开源操作系统(linux是啥都不知道自己去XX吧),而linux系统的内存管理有其独特的动态存储管理机制。
不过Android系统对Linux的内存管理机制进行了优化,Linux系统会在进程活动停止后就结束该进程,而Android把这些进程都保留在内存中,直到系统需要更多内存为止。
这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。
如果你懂java,就会更容易理解Android系统的内存管理机制。
与java的垃圾回收机制类似,系统有一个规则来回收内存。
进行内存调度有个阈值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。
Android系统有六类进程:
前台进程、可见进程、次要服务、后台进程、内容供应节点、空进程。
对于高手而言可以用MinFreeManager之类的软件进行进程管理,分别为六类进程设定不同的阈值来操纵系统的内存分配机制。
不过对于一般用户而言,Android系统默认的分配机制已经可以满足使用需要,因此也不需要再去调整。
对于一些内存很低的低端Android机而言,系统默认的内存分配机制无法实现很完善的内存调配。
所以在运行大型游戏时需要先清理一下内存。
然而对于我们的ANDROID系统的手机而言,几百m的总内存和几十m的空余内存已经可以充分的满足系统自动调配的需要,因此完全没有必要老去杀进程、清内存。
有的兄弟说后台挂着程序很费电,事实上Android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。
至于QQ、音乐播放之类的程序可以在后台运行,是因为这些程序在后台开启了服务,而服务可以后台运行,所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。
这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源。
Android系统这样的设计不仅非常适合移动终端的需要,而且减少了系统崩溃的可能,确保了系统的稳定性。
老想着清理内存的同学完全是因为被塞班或者Windows毒害太深,事实上,经常用Taskiller之类的软件关闭后台所有进程,很容易造成系统的不稳定。
很多时候出现问题,只要重启就能解决,其原因也在于此。
说了这么多,总结起来很简单,牛B的人自己去操纵系统内存分配的阈值,而普通用户则是想怎么用就怎么用,完全不用去鸟剩余内存的问题,那些内存清理的程序完全可以扔到一边了。
后面附上一个很好用的分配系统阈值的工具autokiller,对于如果有同学真的那么喜欢看着自己手机的剩余ram很大的话,可以用这个工具,这个工具的原理不是杀进程,而是分配系统内存阈值,很简单很好用。
PS:
1.按home退出,程序保留状态为后台进程;按返回键退出,程序保留状态为空进程。
空进程的oom_adj评值高于后台进程,更容易被系统清理。
所以推荐用返回键退出。
2.UC、愤怒小鸟、都市赛车之类程序本身提供关闭功能的,还是尽量主动关闭。
浏览器、电子市场、operamini等不提供关闭功能的,直接返回键退出就行。
Android是如何管理进程的
在Android里,进程和程序是两回事,程序可以一直保留在系统里,但是没有任何进程在后台“运行”,也不消耗任何系统资源。
所有的程序保留在内存中,所有可以更快的启动回到它之前的状态。
当你的内存用完了,系统会自动帮你杀掉你不用的任务。
需要明白的是,Android用RAM的方式,跟windows啥的是两回事。
在Android的世界里面,RAM被用满了是件'好'事。
它意味着你可以快速打开之前打开的软件,回到之前的位置。
所以Android很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的电话。
而实际上,是你的CPU——当你的软件真正运行时用到的东东——才是拖慢手机的瓶颈。
为啥说进程管理软件是祸害
很流行的各种进程管理软件都说帮你释放内存是件好事,但这是不正确的。
打开这些软件时,他们告诉你“运行”的软件和杀死他们的方法。
你也可以在“服务”里面看到到底程序的哪些部分在“运行”,占用了多少内存,剩余多少内存。
所有的这些都告诉你,杀掉这些程序能够释放内存。
但是这些软件都没有告诉你这些程序到底消耗了多少CPU时钟,而仅仅告诉你能释放多少内存。
要知道,用满了内存实际上是件好事,我们要注意的是CPU,真正消耗你的手机资源,消耗电池的东东。
因此,杀掉程序通常是没有必要的(尤其是用"autokill"方式杀掉程序)。
更严重的是,这样做会更快的拖垮你的手机能力和电池性能。
不管是手动杀掉进程,还是自动的杀掉进程,重新打开程序,你实际上是在用CPU资源来做这件事。
事实上,这些进程管理软件消耗了系统资源。
而且,这些软件会莫名其妙的杀死其他程序造成乱七八糟的结果(尤其对些小白来说)。
所有的这些,告诉我们,你的手机在用它自己的方式工作,特别是你只是个小白用户,用这些进程管理软件耽误的事情比得到的要多。
那么你应该怎么做呢
这么说吧,各种程序开发水平是不一样的。
很多人以前或者现在使用这些进程管理软件,释放内存,感觉手机快了那么一点。
造成这个问题的原因是,你用的软件本身程序写得太烂了,比如,有得程序完全没有必要联网时,还在联着。
这个时候,杀掉这些程序,你能得到好处,就是说,只有你知道你在干什么得时候,杀掉让你爱但是很烂的程序才能帮上你。
事实上,很多开发者,包括ROM开发者,如果用了进程管理程序,当你提交bug报告时,看都不会看一眼(Cyanogen时这么干的,我不知道MIUI是不是),所以能不用就不要用了,除非你真的知道你在干什么。
如果你真关系你的手机的表现和进程,还是多关注下系统进程,看看里面说各种程序都消耗了多少资源,如果某个程序消耗太多,时不时杀掉它可能会有那么一点帮助。
总的来说,进程管理软件正确的用途是杀那些出错的程序、会导致死机有BUG的进程以及疑似病毒进程等,而不是一味地追求内存空得多程序在内存里放着,CPU不调用,它就是死的,一般程序你退出了它就不再运行了,不占用CPU资源(占用了CPU时间这个才是要耗电的),这就是2.2以上版本系统那个“快速启动”的工作原理。
如果还是没有看懂,后面还有一篇文章有助理解
Android的内存,进程调度管理
(二)
不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本来就是安卓Android标榜的优势之一,如果人为去关闭进程,没有太大必要.特别是自动关进程的软件.
到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?
其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候.这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统.所以,论坛上有个更改内存阀值的程序可以有一定改善. 但改动也可能带来一些问题,取决于值的设定.
那么,进程管理软件有无必要呢?
有的.就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度.但一些小程序,完全可交由系统自己管理.谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电.我就说说安卓Android后台的原理,你就明白了.安卓Android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态.所以为什么有的程序切出去重进会到主界面.但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务.服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了.这个在进程管理软件里能看到,标签是service.至于广播什么的我就不涉及了.所以没有带服务的应用在后台是完全不耗电的,没有必要关闭.这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个安卓Android的优点呢?
还有一个.为什么安卓Android一个应用看起来那么耗内存.大家知道,安卓Android上的应用是java,当然需要虚拟机,而安卓Android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机.这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存.
以上这些设计确保了安卓Android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现.大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要.大家不妨按我说的习惯来用用这个系统.最后推荐一款进程管理软件,systempanel,market上能搜到,界面友好启动快,功能也不错,用于手动关闭进程很好的软件. 祝大家玩机愉快,这系统开十天半个月都没问题,不是windows.
至于为什么开了大程序或者开了好几个程序之后切换会变慢,我的理解如下:
1.大程序A已经开启,占用70%内存,如果再想运行一个B,需要50%的内存,则就需要一个将A从内存中释放或者压缩的过程,所以表现出来的就是慢一会儿
2.A\B\C\D\E共占用内存80%,运行新程序Z需要20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从A~E这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿
3.也就是说你手动去杀程序的时候,就是替系统在释放内存,就算你不杀,在需要内存的时候系统也会自动释放.
4.不在后台运行的程序(没服务的),即使不杀也不会耗电.在后台运行的(有服务的)程序,如后台放歌,当然会耗电.
5.不是说杀进程没用,不然作者就不会推荐进程管理软件了.哪个带服务耗电哪个后台一直在运行,看服务就能看出来,这样的该杀.
6,以qq举例,正常的退,会在进程管理里留下qq的运行状态,但不耗电不占cpu,如果你只是切换出去(按小房子而不是退出)那么自然会耗电,因为程序还在运行.
(qq后台一样后台就是qq正常退出的时候和别的软件一样不完全退出会在内存里留着 但是不占cpu不费电再次启动就会非常快了这就是为什么android能超越WM6的系统的原因)
简单的说说房子键和退出键的区别,轻度研究手机的内存管理!
!
!
在运行一个程序时,按一下房子键就可以退到桌面,一般来说按一下退出键也可以退到桌面,这两者有什么区别呢?
其实是有区别的,你应该根据自己的需要灵活选择
按房子键,看起来似乎是退出了,但是其实这个软件并没有被关闭,而是转为了后台程序(指一般的软件,不讨论特别种类的软件)
按退出键,看起来也是退出没错,但这个软件其实是被转为了空置程序(音乐除外,音乐属于有服务的特殊软件)
咱们再来看看下图,是android的所有5个程序进程的级别高低,空进程是最低的,它存在的目的是为了下次打开这个软件的时候可以更加方便快速(这是个很好的设计目的),而一旦需要清理出更多内存空间时,它也是被系统自动的最优先清除的
系统进程级别图,级别越低的会越快越早的被系统智能清理掉
所以,大家明白了吧?
一旦需要退出软件时,如果是没有提供退出功能的软件,那么尽量用退出键退出而不是房子键,并且,最重要的是,没有必要用进程管理类软件主动去清理空置进程,因为它本来就是为了被清理而存在,但在没轮到它被清理之前,还可以发挥重新快速开启的作用,一旦被你主动清理了,就连这点好处都没有了,那么,android系统的设计师又何必要设计出这个空置程序呢?
直接释放内存不是更好么?
所以,结论就是,既然它存在,就有它存在的好处!
就要让我们享受到这个好处!
用进程管理主动去清除空置程序绝对是违反android系统的设计本意的,是一种可笑的傻做法!
再来说说房子键
众所周知,android跟iphone不同,咱们的gphone是一个典型的多任务系统,既然是多任务系统,那么自然就会有一个在多任务之间切换的需要,那么大家是否真的都会这个操作呢?
这时候,就需要用到房子键了,在一个程序中的时候,比如短信息,看到几个单词不认识,那么就可以选中这段文字,然后复制,按房子键切换到桌面,然后打开词典,粘贴,查询,查好后再长按房子键(长按的作用是在几个打开的程序和最近曾打开的程序之间切换),切换回短信息,这时候短信息程序不需要重新打开仍然是你刚才的界面,可以再复制然后长按切换词典继续查询下一个单词。
。
。
。
这就是房子键的用法,其实想必大家都知道这个用法,只不过可能没有考虑过其实这是一个前后台程序之间切换的过程而已。
。
。
最后,简单的归纳一下所有内容,其实整篇文章的意思就是说,按退出键相当于“真正的”退出关闭程序,按房子键,看起来似乎是关闭了程序,但是其实只是一种假象,程序只是被降低了仅仅“一”个等级而已,房子更适合多任务切换用,就这么简单。
。
。
关于android内存管理的原理,及相关自动内存管理软件原理
Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多内存为止。
这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。
那Android什么时候结束进程?
结束哪个进程呢?
之前普遍的认识是Android是依据一个名为LRU(lastrecentlyused最近使用过的程序)列表,将程序进行排序,并结束最早的进程。
XDA的楼主又进一步对这个管理机制进行研究,有了如下发现:
1.系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程;(系统会根据“oom_adj”来判断需要结束哪些进程,一般来说,“oom_adj”的值越大,该进程被系统选中终止的可能就越高)
2.前台程序的“oom_adj”值为0,这意味着它不会被系统终止,一旦它不可访问后,会获得个更高的“oom_adj”,作者推测“oom_adj”的值是根据软件在LRU列表中的位置所决定的;
3.Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制性,可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。
这给了进程管理脚本的编写以更多的选择。
4.Android将进程分为六大类:
1.前台进程(foreground):
目前正在屏幕上显示的进程和一些系统进程。
举例来说,DialerStorage,GoogleSearch等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。
我们最不希望终止的进程就是前台进程。
2.可见进程(visible):
可见进程是一些不再前台,但用户依然可见的进程,举个例来说:
widget、输入法等,都属于visible。
这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)
3.次要服务(secondaryserver):
目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:
谷歌企业套件,Gmail内部存储,联系人内部存储等。
这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
4.后台进程(hidden):
虽然作者用了hidden这个词,但实际即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。
当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程
(background)。
后台进程的管理策略有多种:
有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。
这里就需要用户根据自己的使用习惯找到一个平衡点
5.内容供应节点(contentprovider):
没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。
在终止进程时,这类程序应该有较高的优先权
6.空进程(empty):
没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。
这部分进程无疑是应该最先终止的。
实践
说完理论,说些实践的东西,怎样管理这六类进程,如何来设置进程管理模块是这部分说的内容。
首先是软件,推荐使用MinFreeManager,市场上就有下载,用于设置这六类进程的管理策略。
软件运行后有六个输入框,在输入框中只能输入数字,这些数字代表了这类进程的处理策略,比如ForegroundApp下的输入框显示6,就表示,当可用内存低于6MB时,终止ForegroundApp。
下面的类似,如EmptyApp下的输入框显示24,则表示,当内存低于24MB时,终止EmptyApp。
从软件数值的设置不难看出结束进程的有限顺序:
Empty>ContentProvider>Hidden>SecondaryServer>Visible>Foreground。
但默认设置确存在一些问题:
各类进程的管理策略的阀值相当接近:
6,8,16,20,22,24,最大的相差也不到8MB,在实际程序运行中,很容易导致多种类型的进程同时被关闭。
如可用内存在25时,突然启动照相程序,系统可用内存急速,可能会导致空进程、内容供应节点、后台进程、次要服务等同时被关闭
阀值上限较低:
一般手机启动后,可用内存在50-100左右,但随着手机的使用,可用内存会逐步减少,最后降低到24MB左右,则系统开始启动进程管理机制,开始结束进程,但这个阀限制设在了24MB,相对来说偏低。
其结果会导致系统使用一段时间后,整体速度变慢。
很明显的就是,当手机长时间使用后,开启电话拨号,相册,照相机等应用时,系统的反应速度极慢。
基于以上几个问题,不难看出,我们修改的目标也将非常明确,主要解决两个矛盾:
拉开各进程的阀值层次,使得进程管理机制能更有效得工作
提升阀值上限,空出更多的空余内存,以提升系统整体的运行速度
进程管理策略设置原则:
前台进程、可见进程和次要服务是与用户体验息息相关的内容,这部分的进程管理策略要相对保守,给这些进程留下足够的运行空间
压榨无用进程,腾出内存空间给主要程序使用
下面笔者总结了几种设置方式,适应不同的使用需要:
游戏玩家/重度浏览器使用者配置:
用户特点:
长时间专注于某一特定的,高内存需求的程序,对多任务的需求不高
配置参数:
1.Foreground:
6
2.Visible:
8
3.SecondaryServer:
16
4.HidenApp:
80
5.ContentProvider:
90
6.Empty:
100
配置理念:
压榨后台进程,内容供应节点和空进程,将内存尽可能多得留给前台进程和系统,提升游戏速度和浏览器体验
优点:
程序启动和运行的速度最快
缺点:
多任务处理不理想,开启程序较多时,后台进程会被终止
多任务配置:
用户特点:
同时运行多个应用程序,需要经常在多个程序间切换
配置参数:
1.Foreground:
6
2.Visible:
8
3.SecondaryServer:
16
4.HidenApp:
20
5.ContentProvider:
60
6.Empty:
100
配置理念:
压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任务的处理能力
优点:
运行多个程序时,由于可支配内存较多,后台程序不容易被终止
缺点:
程序启动的速度和整体系统的运行速度可能会比游戏玩家配置略慢一些,由于经常运行多任务,平时系统的响应速度会受到一定影响
轻度用户/女生专用配置
用户特点:
手机的主要功能是短信和电话,偶尔用用相机自拍
配置参数:
1.Foreground:
6
2.Visible:
8
3.SecondaryServer:
16
4.HidenApp:
24
5.ContentProvider:
32
6.Empty:
48
配置理念:
压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任务的处理能力
优点:
比较均衡的配置,提升了系统的可用内存,使得系统的整体速度得到了提高,拉开了各级进程的管理策略层次,使得管理机制更有效率
缺点:
比较均衡的配置,无明显缺点
以上内容主要是转发,对大家了解android的内存管理机制有帮助,小鱼程序的原理也基于这个。
Android的原理-不需要太多的剩余内存
不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本来就是安卓Android标榜的优势之一,如果人为去关闭进程,没有太大必要.特别是自动关进程的软件.
到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?
其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候.这种情况下系统并不会关闭所有打开的进程,而是选择性关
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android进程调度 内存管理 android 进程 调度 内存 管理