天天看点

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系统,其剩余内存变少的原因

系统内存的变化原理:

首先是因为系统对于每一个用户使用的界面和后面的背景状态数据(系统称为activity),系统希望都能记住,以便用户下次再用的时候,很快调出来,让用户觉得很爽。所以系统企图记住所有的用过东西。这个是实时系统的设计理念。

  这样说来,由于系统希望尽可能的在内存中记住所有的activity,导致后果是我们发现手机中的剩余内存并不会多。除非这个系统很安静,一直没有运行什么程序,例如开机的时候。

  最后内存少到一个临界点的时候,或者用户突然运行大的程序,系统通过一定的内存调度算法开始释放内存,杀掉acitivity。这个原理可以说明我们通过按home键换程序 有时候可以回到原来的状态,有时候不能切换到程序原来的状态。

  从上面得知可以说明大内存的好处是系统启动内存调度次数少少,保存的记忆界面多,会较长时间给使用者嗖嗖快的感觉。而内存少的机器只能在较短时间拥有这种感觉,例如开机后或者杀程序后的一段时间内。

   杀程序的内存变化原理:

  对于杀程序我觉得是从linux角度来杀掉进程,即程序的虚拟机,内存被释放,程序不耗电

  程序自己退出,如果调用finish()退出的,也能释放内存,不耗电。但是不是这样退出的就很难说了,例如一些后台程序,例如连云助手,闹钟程序等

  用户不退出程序,再启动另外一个程序,那个是耗电的,因为系统在内存中记住了第一个程序的activity,后台还在跑。

SWAP的情况:

  另外说一下Swap情况下,即使TF卡和内存一样快,总体来说Swap还是慢一点。因为尽管此时总的内存大了,在程序层面不需要频繁调度activity,但是最底层Linux上还是需要普通的物理内存和虚拟内存之间的页面调度。

  这个的速度应该是比大内存差些,比小内存好些。但是如果你程序不多,比直接使用小内存还要慢一些

小内存I5700的策略:

1。如果你不使用大程序,同时不使用多个程序。还是不要用Swap。需要记忆的东西本来就不多吗,这样每个程序你使用起来理论上是应该很快的。

2. 反之,则用Swap,在复杂的环境中快一些

  3。 另外一个办法是如果你也不知道自己的使用习惯,你就平常多看看自己的内存余额,长期在25以下,可以考虑使用swap了。

  4.经常杀掉程序,如果你很care自己的运行速度 。其实这个也是可以不用的,系统有自己的调度。除非你慢的实在不行。

  切换算法,大意的优先顺序如下:

  就是先干掉那些没有啥关联业务提供的activity,例如短信和记事本则先关掉记事本。

  然后按照先进先出的方式杀程序,

   然后按照后台的,

   最后关掉前台用户看到的。

ANDROID系统,其剩余内存变少的原因

系统内存的变化原理:

首先是因为系统对于每一个用户使用的界面和后面的背景状态数据(系统称为activity),系统希望都能记住,以便用户下次再用的时候,很快调出来,让用户觉得很爽。所以系统企图记住所有的用过东西。这个是实时系统的设计理念。

  这样说来,由于系统希望尽可能的在内存中记住所有的activity,导致后果是我们发现手机中的剩余内存并不会多。除非这个系统很安静,一直没有运行什么程序,例如开机的时候。

  最后内存少到一个临界点的时候,或者用户突然运行大的程序,系统通过一定的内存调度算法开始释放内存,杀掉acitivity。这个原理可以说明我们通过按home键换程序 有时候可以回到原来的状态,有时候不能切换到程序原来的状态。

  从上面得知可以说明大内存的好处是系统启动内存调度次数少少,保存的记忆界面多,会较长时间给使用者嗖嗖快的感觉。而内存少的机器只能在较短时间拥有这种感觉,例如开机后或者杀程序后的一段时间内。

   杀程序的内存变化原理:

  对于杀程序我觉得是从linux角度来杀掉进程,即程序的虚拟机,内存被释放,程序不耗电

  程序自己退出,如果调用finish()退出的,也能释放内存,不耗电。但是不是这样退出的就很难说了,例如一些后台程序,例如连云助手,闹钟程序等

  用户不退出程序,再启动另外一个程序,那个是耗电的,因为系统在内存中记住了第一个程序的activity,后台还在跑。

SWAP的情况:

  另外说一下Swap情况下,即使TF卡和内存一样快,总体来说Swap还是慢一点。因为尽管此时总的内存大了,在程序层面不需要频繁调度activity,但是最底层Linux上还是需要普通的物理内存和虚拟内存之间的页面调度。

  这个的速度应该是比大内存差些,比小内存好些。但是如果你程序不多,比直接使用小内存还要慢一些

小内存I5700的策略:

1。如果你不使用大程序,同时不使用多个程序。还是不要用Swap。需要记忆的东西本来就不多吗,这样每个程序你使用起来理论上是应该很快的。

2. 反之,则用Swap,在复杂的环境中快一些

  3。 另外一个办法是如果你也不知道自己的使用习惯,你就平常多看看自己的内存余额,长期在25以下,可以考虑使用swap了。

  4.经常杀掉程序,如果你很care自己的运行速度 。其实这个也是可以不用的,系统有自己的调度。除非你慢的实在不行。

  切换算法,大意的优先顺序如下:

  就是先干掉那些没有啥关联业务提供的activity,例如短信和记事本则先关掉记事本。

  然后按照先进先出的方式杀程序,

   然后按照后台的,

   最后关掉前台用户看到的。

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,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。