查看: 5805|回复: 25
收起左侧

[讨论] android的原理,不用在意剩余内存的大小

 关闭 [复制链接]
88865ff
发表于 2013-12-20 19:52:48 | 显示全部楼层 |阅读模式
ndroid的原理,不用在意剩余ram内存的大小
不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓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(last
recently used
最近使用过的程序)列表,将程序进行排序,并结束最早的进程。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):目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer
Storage,Google
Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显
示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序
(background)。我们最不希望终止的进程就是前台进程。
2.可见进程(visible):可见进程是一些不再前台,但用户依然可见的进程,举个例来说:widget、输
入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被
终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止
,否则你每次输入时都需要重新启动输入法)
3.次要服务(secondary
server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈
次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要
服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
4.后台进程(hidden):虽然作者用了hidden这个词,但实际即是后台进程(background),就是我们
通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运
行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),
程序就驻留在后台,成为后台进程
(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种
方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程
序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就
需要用户根据自己的使用习惯找到一个平衡点
5.内容供应节点(content
provider):没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在
终止进程时,这类程序应该有较高的优先权
6.空进程(empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进
程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记
录程序的一些历史信息。这部分进程无疑是应该最先终止的。
实践
说完理论,说些实践的东西,怎样管理这六类进程,如何来设置进程管理模块是这部分说的内容。
首先是软件,推荐使用MinFreeManager,市场上就有下载,用于设置这六类进程的管理策略。
软件运行后有六个输入框,在输入框中只能输入数字,这些数字代表了这类进程的处理策略,比如
Foreground
App下的输入框显示6,就表示,当可用内存低于6MB时,终止Foreground App。下面的类似,如Empty
App下的输入框显示24,则表示,当内存低于24MB时,终止Empty
App。
从软件数值的设置不难看出结束进程的有限顺序:Empty>Content
Provider>Hidden>Secondary
Server>Visible>Foreground。
但默认设置确存在一些问题:
各类进程的管理策略的阀值相当接近:6,8,16,20,22,24,最大的相差也不到8MB,在实际程序运行
中,很容易导致多种类型的进程同时被关闭。如可用内存在25时,突然启动照相程序,系统可用内存急
速,可能会导致空进程、内容供应节点、后台进程、次要服务等同时被关闭
阀值上限较低:一般手机启动后,可用内存在50-100左右,但随着手机的使用,可用内存会逐步减少,
最后降低到24MB左右,则系统开始启动进程管理机制,开始结束进程,但这个阀限制设在了24MB,相对
来说偏低。其结果会导致系统使用一段时间后,整体速度变慢。很明显的就是,当手机长时间使用后,
开启电话拨号,相册,照相机等应用时,系统的反应速度极慢。
基于以上几个问题,不难看出,我们修改的目标也将非常明确,主要解决两个矛盾:
拉开各进程的阀值层次,使得进程管理机制能更有效得工作
提升阀值上限,空出更多的空余内存,以提升系统整体的运行速度
进程管理策略设置原则:
前台进程、可见进程和次要服务是与用户体验息息相关的内容,这部分的进程管理策略要相对保守,给
这些进程留下足够的运行空间
压榨无用进程,腾出内存空间给主要程序使用
下面笔者总结了几种设置方式,适应不同的使用需要:
游戏玩家/重度浏览器使用者配置:
用户特点:长时间专注于某一特定的,高内存需求的程序,对多任务的需求不高
配置参数:
1.Foreground:6
2.Visible:8
3.Secondary
Server:16
4.Hiden App:80
5.Content
Provider:90
6.Empty:100
配置理念:压榨后台进程,内容供应节点和空进程,将内存尽可能多得留给前台进程和系统,提升游戏
速度和浏览器体验
优点:程序启动和运行的速度最快
缺点:多任务处理不理想,开启程序较多时,后台进程会被终止
多任务配置:
用户特点:同时运行多个应用程序,需要经常在多个程序间切换
配置参数:
1.Foreground:6
2.Visible:8
3.Secondary
Server:16
4.Hiden App:20
5.Content
Provider:60
6.Empty:100
配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任
务的处理能力
优点:运行多个程序时,由于可支配内存较多,后台程序不容易被终止
缺点:程序启动的速度和整体系统的运行速度可能会比游戏玩家配置略慢一些,由于经常运行多任务,
平时系统的响应速度会受到一定影响
轻度用户/女生专用配置
用户特点:手机的主要功能是短信和电话,偶尔用用相机自拍
配置参数:
1.Foreground:6
2.Visible:8
3.Secondary
Server:16
4.Hiden App:24
5.Content
Provider:32
6.Empty:48
配置理念:压榨空进程,给内容供应节点留有一定空间,最大限度提升后台程序的使用空间,提升多任
务的处理能力
优点:比较均衡的配置,提升了系统的可用内存,使得系统的整体速度得到了提高,拉开了各级进程的
管理策略层次,使得管理机制更有效率
缺点:比较均衡的配置,无明显缺点
以上内容主要是转发,希望对大家了解android的内存管理机制有帮助
dfliaoyue
发表于 2013-12-20 20:23:15 | 显示全部楼层
本帖最后由 dfliaoyue 于 2013-12-20 20:27 编辑

真够老的文章,就不去批驳了。补充点吧
杀进程是很无聊的行为。ICS(4.0)之前的除外

ICS起,安卓的内存管理机制已经比你转载的有极大优化。后台不活动进程不再保存在RAM,而是保存成缓存文件。换言之,RAM只为活动的前台和后台进程准备。

调节内存阈值不太必要。

有的应用按返回键后仍不会完全退出(能经过设置后完全退出的不算,需要在后台工作的不算)。包括:百度贴吧、知乎等等。QQ不能完全退出的问题早就解决了。而Google服务的常驻服务是平台级别的,从而比如Gmail同步服务正常情况下不会常驻后台,而是使用Gcm推送。这种机制和IOS的推送原理上是一样的。

安卓4.4Kitkat占用内存比Jelly Bean(4.1-4.3)、ICS(4.0)小几十兆,至于GB(2.3),可以说是没救了。

安卓系统用着用着可能会出现静态占用越来越多的情况,这是内存溢出的问题。KK(4.4)解决的不错,可以把静态占用保持在低水平上,大幅降低了高内存占用应用的启动时间和强退频率。

与其折腾系统清理内存的阈值,不如管理启动项和禁用服务项。但要注意的是,禁用一些应用的自启receiver可能会导致其后台服务不能自动退出。所以,启动项和服务项管理这两件利器不要轻易动用,不流氓的应用就别动它,免得给逼成流氓了

常驻后台的应用节约内存的办法:只加载必要的部分;清理掉不需要的部分,但可以在清理前等一会确定不再使用。以两个Google应用为例:Google拼音自几个月前的一次更新后,后台内存占用从20-30M降到了10M左右,办法就是在输入法启动时再加载词库;Google Play Music在退出后PlayBack Service会呆10-50s再退出

评分

参与人数 1经验 +5 收起 理由
丟了過厺 + 5 感谢解答: )

查看全部评分

Caffeine-
发表于 2013-12-20 21:31:15 | 显示全部楼层
严重错误。
丟了過厺
发表于 2013-12-20 21:53:53 | 显示全部楼层
dfliaoyue 发表于 2013-12-20 20:23
真够老的文章,就不去批驳了。补充点吧
杀进程是很无聊的行为。ICS(4.0)之前的除外

说得很详细。安卓太耗硬件了。对于内存小,或者是应用发烧友而言,只要用安卓系统就会需要杀进程,这样才能有剩余的内存,不然会卡死去。
biange200
发表于 2013-12-20 22:19:58 | 显示全部楼层
丟了過厺 发表于 2013-12-20 21:53
说得很详细。安卓太耗硬件了。对于内存小,或者是应用发烧友而言,只要用安卓系统就会需要杀进程,这样才 ...

512RAM的手机 不杀 会非常卡
dfliaoyue
发表于 2013-12-20 22:21:27 | 显示全部楼层
丟了過厺 发表于 2013-12-20 21:53
说得很详细。安卓太耗硬件了。对于内存小,或者是应用发烧友而言,只要用安卓系统就会需要杀进程,这样才 ...

你觉得512M内存小吗?还是吃硬件超牛逼的三星
biange200
发表于 2013-12-20 23:04:53 | 显示全部楼层

RE: android的原理,不用在意剩余内存的大小

dfliaoyue 发表于 2013-12-20 20:23
真够老的文章,就不去批驳了。补充点吧
杀进程是很无聊的行为。ICS(4.0)之前的除外

手机缓存进程多 费电吗 是不是会占用ram 我只有474mb ram
w2angel
发表于 2013-12-21 00:52:05 | 显示全部楼层
安卓上面的软件你只要打开了就只能手动关闭进城才能完全关闭,自己的退出还有进城
dfliaoyue
发表于 2013-12-21 01:03:37 | 显示全部楼层
biange200 发表于 2013-12-20 23:04
手机缓存进程多 费电吗 是不是会占用ram 我只有474mb ram

不可能是474M这个奇葩数字的。应该是系统预留了一部分。我这显示的RAM只有352M。4.3随着使用静态占用会涨到260M。4.4系统会自动处理溢出的RAM,静态占用能保持在150-190M。
缓存没管过,有时会比较多,但是缓存程序是不占用RAM的,类似windows里的页面缓存。
费电,一般不费电,不过刷的4.4系统暂时不够成熟,Google服务极偶然会造成系统持续唤醒造成每小时%5的耗电。正常情况下待机耗电为%1每1.5-2.5小时。电池是1800mAh
wuhangju
发表于 2013-12-21 11:54:58 | 显示全部楼层
懒得看你的原理,剩余内存是重要的,缓存占用内存的确能提速,但Android的问题是,每个程序自带推送,导致后台服务进程随着软件的安装而增加,越来越卡。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-7-6 14:52 , Processed in 0.136225 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表