




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ANDROID内存管理原理我们一直听说Android是一个多进程操作系统,那么它是如何处理每一个进程呢?: s/ b* e. z1 uI2 z3 l6 q( 3 q大家可能已经发现 Android自身并没有所谓的关闭进程的说法 每当我们要退出一个进程回到桌面/打开另一个程序的时候我们只能按返回键. 而当我们按下返回键后,该进程并没有真正的关闭,仍然保存在内存中. 这样在下次调用的时候可以更快的打开该程序.要想真正的关闭一个已打开的进程,除了用第三方软件(例如advanced task manager)外,还有一个,那就是当Android系统认为当时已经没有足够的内存来运行新的进程,需要关闭一些虽然已经开着,但是没有用了(具体怎样一个进程才会被Android系统认为是没有用下面就要讨论到)的进程.而下面要研究的就是这个Android内部的lowmemorykiller.ActivityManagerService.java记录着每一个进程的优先级. 一个进程的oom_adj值也就代表了它的优先级. oom_adj值越高代表该进程优先级越低. 一个正在使用的进程的oom_adj值为0,一旦我们按下返回键,这个进程就会得到一个更高的oom_adj值(更低的优先级). 具体多少取决于该进程在LRU(last recently used) list的位置.(未证实)具体的细节保存在Android源文件drivers/misc/lowmemorykiller.c里.Android将进程分为6个等级,它们按优先级顺序由高到低依次是:. R1. FOREGROUND_APP:1 # ; q% w: N A5 j7 g This is the process running the current foreground app.Wed really rather not kill it!r用户正在使用的程序. 这个设的太高,用户看到得就会是一个正在使用的程序莫名其妙的消失了,然后自动回到桌面.(因为它被系统kill了.) 所以最好别动它. 9 H! q9 J, F! l A 2. VISIBLE_APP: _% _) e0 I?/ V( 6 K$ zThis is a process only hosting activities that are visible to the user, so wed prefer they dont disappear.- K$ 6 , g z6 tX跟FOREGROUND_APP类似,用户正在使用/看得到. 它们的区别就是VISIBLE_APP可能不是用户focus的程序,但是用户看得到,或者没有覆盖到整个屏幕,只有屏幕的一部分. 所以可以适当的比FOREGROUND_APP高一点. # m7 ?( S9 W2 k1 ) * X: w5 F C3. SECONDARY_SERVER:8 p. g. G( Q2 FThis is a process holding a secondary server - killing it will not have much of an impact as far as the user is concerned. 5 F) H! B! M; ! s; N2 i 所有应用的service. 系统级的service比如PhoneService不属于这类,它们是绝不会被Android结束掉的. 所以这个可以适当的设高一点点 注意, HOME(SenseUI)也包括在这里 因此还是别设的太高. 要不每次返回桌面都得等它重新load,特别是widget多的., |( Q, W3 s/ F3 % Y - k- i, H; v/ f f3 P* f& l4. HIDDEN_APP:. TThis is a process only hosting activities that are not visible, so it can be killed without any disruption.; o A5 Y- Q4 ! V) r; 本来属于1或者2的程序, 在用户按了back或者home后,程序本身看不到了,但是其实还在运行的程序,它们就属于HIDDEN_APP了. 干掉没什么影响. 不过要了解并不是所有属于这一类的就应该马上结束掉,像push mail,locale,闹钟,等都属于这一类. 因此还是别设的过高. 真正应该一点返回键就退出的程序(真正没用的程序)在下面. # ! T. q+ b- M; g$ g9 ?5. CONTENT_PROVIDER:This is a process with a content provider that does not have any clients attached to it.If it did have any clients, its adjustment would be the one for the highest-priority of those processes.# e0 G7 ! y4 p5,6的区别具体不太了解.这个也是用处不大,但是还是比EMPTY_APP稍微有点用. 所以高点没关系16. EMPTY_APP:0This is a process without anything currently running in it.Definitely the first to go! This value is initalized in the constructor, careful when refering to this static variable externally.!完全没用的一个,杀了它只有好处没坏处,第一个干它!7 B* M- |; t9 ! Y0 I7 t9 m% s1 G: b% C2 C: r% 查看现在的设置可以:-1. # cat /sys/module/lowmemorykiller/parameters/minfree/ 7 B, J7 7复制代码* R) U O6 F2 ?5 显示出的应该是6个数字,以逗号隔开,例如:20 x# $ F 8 Z1536,2048,4096,5120,5632,6144注意这些数字的单位是page. 1 page = 4 kilobyte.O# e2 a: r _* K( X上面的六个数字对应的就是(MB): 6,8,16,20,22,24这些数字也就是对应的内存阀值,一旦低于该值,Android便开始按顺序关闭进程. 因此Android开始结束优先级最低的EMPTY_APP当可用内存小于24MB(6144*4/1024).3 r r; d- W3 7 有一点没搞明白,它的可用内存不知道是从哪得到. 明显不是free显示的可用内存,而且貌似compcache跟swap也不影响.要想重新设置该值:&1. # echo 1536,2048,4096,5120,15360,23040 /sys/module/lowmemorykiller/parameters/minfree& + o8 o7 |$ J5 a7 H* K* u! 8 E; l/ C; i- $ 复制代码3 e& s2 e. X d3 Q7 N! ( e d这样当可用内存低于90MB的时候便开始结束EMPTY_APP. 而当可用内存低于60MB的时候才开始结束CONTENT_PROVIDER组. 其余四个没动.0 o4 9 _4 z4 C9 i5 u1 v$ * h! G# T1 S5 D3 $ V注意: 8 ) U- v $ c3 t & i通过以上方法改变的数值并非永久.在下次重启后就又恢复到之前的设置. 若想让设置在每次开机执行,将1. echo 1536,3072,4096,21000,23000,25000 /sys/module/lowmemorykiller/parameters/minfree$ $ Z8 j$ A7 j+ k( e# p复制代码8加入到任意一个开机启动的配置文件. 一般在/system/init.d下的文件都是开机执行的(有的ROM也可能不在这里.) 只需用记事本打开任意一个文件,再把这行加入其中就好.原作者做了一个应用,在market里免费,让大家更改设置更方便,叫 MinFreeManager.( B W, a6 T/ r3 上面给出的数字只供参考,具体多少才是最优组合正在研究中.3 y J. Z9 b p=8 个人经验补充一点:( F2 $ a: 3 n一般前三个不用动,或者只是稍微改高一点就好,毕竟它们比较重要,不要太早结束. 值得关注的是后三个. 它们也可以适当的设大一点. 当然,任何东西都有一个度,像上面例子中EMPTY_APP搞到25000(97MB)并不至于大到离谱,hero我没有过 我在Magic 32A甚至还试过120MB.不过120MB那是有点过头了.游戏玩着玩着就消失回到桌面了(可用内存低于120MB被系统结束任务了). 因此还是不要太高.7 b) u/ b4 6 a- N4 x1 f/ T我目前的设置(开了32MB的CC加32MB的backing swap 60 swappiness): 1536,2048,4096,8192,11520,192001 0 n: |6 g5 s, z3 y也许大家还不明白这样做的好处. 这样的好处就是让我们随时有足够的内存来执行我们要运行的程序,而那些真正没用的进程又不会多余的占用着宝贵的内存. 更重要的是这一切都是不需要您的参与或任何第三方软件的协助,完全由Android在后台自动执行. 试想,又有谁会比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.ABCDE共占用内存80%,运行新程序Z需要 20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从AE这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿3.也就是说你手动去杀程序的时候,就是替系统在释放内存,就算你不杀,在需要内存的时候系统也会自动释放.4.不在后台运行的程序(没服务的),即使不杀也不会耗电.在后台运行的(有服务的)程序,如后台放歌,当然会耗电.5.不是说杀进程没用,不然作者就不会推荐进程管理软件了.哪个带服务耗电哪个后台一直在运行,看服务就能看出来,这样的该杀.6,以qq举例,正常的退,会在进程管理里留下qq的运行状态,但不耗电不占 cpu,如果你只是切换出去(按小房子而不是退出)那么自然会耗电,因为程序还在运行.(qq后台一样后台 就是qq正常退出的时候 和别的软件一样 不完全退出 会在内存里留着但是不占cpu 不费电 再次启动就会非常快了 这就是为什么 android 能超越 WM6的系统的原因)简单的说说房子键和退出键的区别,轻度研究手机的内存管理!在运行一个程序时,按一下房子键就可以退到桌面,一般来说按一下退出键也可以退到桌面,这两者有什么区别呢?其实是有区别的,你应该根据自己的需要灵活选择按房子键,看起来似乎是退出了,但是其实这个软件并没有被关闭,而是转为了后台程序(指一般的软件,不讨论特别种类的软件)按退出键,看起来也是退出没错,但这个软件其实是被转为了空置程序(音乐除外,音乐属于有服务的特殊软件)但是,该软件的默认设置确存在一些问题:各类进程的管理策略的阀值相当接近:6,8,16,20,22,24,最大的相差也不到8MB,在实际程序运行中,很容易导致多种类型的进程同时被关闭。如可用内存在25时,突然启动照相程序,系统可用内存急速,可能会导致空进程、内容供应节点、后台进程、次要服务等同时被关闭阀值上限较低:一般手机启动后,可用内存在50-100左右,但随着手机的使用,可用内存会逐步减少,最后降低到24MB左右,则系统开始启动进程管理机制,开始结束进程,但这个阀限制设在了24MB,相对来说偏低。其结果会导致系统使用一段时间后,整体速度变慢。很明显的就是,当手机长时间使用后,开启电话拨号,相册,照相机等应用时,系统的反应速度极慢。基于以上几个问题,不难看出,我们修改的目标也将非常明确,主要解决两个矛盾:拉开各进程的阀值层次,使得进程管理机制能更有效得工作提升阀值上限,空出更多的空余内存,以提升系统整体的运行速度进程管理策略设置原则:前台进程、可见进程和次要服务是与用户体验息息相关的内容,这部分的进程管理策略要相对保守,给这些进程留下足够的运行空间压榨无用进程,腾出内存空间给主要程序使用下面放出几种设置方式,适应不同的使用需要:游戏玩家/重度浏览器使用者配置:用户特点:长时间专注于某一特定的,高内存需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 11《葡萄沟》教学设计-2024-2025学年统编版二年级语文上册
- 《自救技能get》主题班会教学设计
- 2024新教材高中地理 第一章 人口与地理环境 第一节 人口分布教学设计 湘教版必修第二册
- 13 猫 教学设计-2024-2025学年语文四年级下册统编版
- 2024-2025学年高中物理 第2章 3 匀变速直线运动的位移与时间的关系教学设计 新人教版必修1
- 13《人物描写一组》 教学设计-2023-2024学年语文五年级下册统编版
- 肥胖患者的气道管理
- Unit 1 My school Part B Read and write Part C Story time(教学设计)-2024-2025学年人教PEP版英语四年级下册
- 2023六年级数学下册 一 欢乐农家游-百分数(二)信息窗2 青岛假日游-百分数实际问题第1课时教学设计 青岛版六三制
- Unit 4 Plants around us 单元整体(教学设计)-2024-2025学年人教PEP版(2024)英语三年级上册
- 日本履历书模板
- 银行账户借用合同协议书范本
- 2022-2023年棉花行业洞察报告PPT
- 《工程质进度-质量管理》培训课件
- 精神科症状学演示课件
- 2.抗美援朝课件(共25张PPT)
- 运动特质自信量表
- 《CSS样式表的使用》教学设计
- 养老护理员考试多选题含答案
- 北师大版小学数学六年级总复习知识点汇总
- 专利权转让合同-电子科技大学计算机学院(20211109173408)
评论
0/150
提交评论