網上看到一篇文章, 關於ANDROID手機RAM的管理

轉載於 http://blog.csdn.net/wzsong123/article/details/6860674
方便閱讀轉為繁體, 請師兄討論下是否合理...

必須得明白Android內存管理,千萬別把windows的習慣帶過來

在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採取了一種有別於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,在程序退出後,依然會在進程中駐留一個空進程,這個進程裡沒有任何數據在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最先終止的。

不用在意剩餘內存的大小,其實很多人都是把使用其他系統的習慣帶過來來了。android大多應用沒有退出的設計其實是有道理的,這和系統對進程的調度機制有關係。如果你知道java,就能更清楚這機制了。其實和java的垃圾回收機制類似,系統有一個規則來回收內存。進行內存調度有個閥值,只有低於這個值系統才會按一個列表來關閉用戶不需要的東西。當然這個值默認設置得很小,所以你會看到內存老在很少的數值徘徊。但事實上他並不影響速度。相反加快了下次啟動應用的速度。這本來就是android標榜的優勢之一,如果人為去關閉進程,沒有太大必要。特別是使用自動關進程的軟件。(這裡解決了大家非要關進程的誤區!)
         到這裡有人會說了,那為什麼內存少的時候運行大型程序會慢呢?其實很簡單,在內存剩餘不多時打開大型程序,會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程序頻繁向系統申請內存的時候。這種情況下系統並不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。所以,論壇上有個更改內存閥值的程序可以有一定改善。但改動也可能帶來一些問題,取決於值的設定。(就是這個程序 自動內存管理V1.4.apk(104.18 KB))
        那麼,進程管理軟件有無必要呢?有的。就是在運行大型程序之前,你可以手動關閉一些進程釋放內存,可以顯著的提高運行速度。但一些小程序,完全可交由系統自己管理。
        談到這裡,可能有的朋友會問,如果不關程序是不是會更耗電。我就說說android後台的原理,你就明白了。android的應用在被切換到後台時,它其實已經被暫停了,並不會消耗cpu資源,只保留了運行狀態。所以為什麼有的程序切出去重進會到主界面。但是,一個程序如果想要在後台處理些東西,如音樂播放,它就會開啟一個服務。服務可在後台持續運行,所以在後台耗電的也只有帶服務的應用了。這個在進程管理軟件裡能看到,標籤是service。至於廣播什麼的我就不涉及了。所以沒有帶服務的應用在後台是完全不耗電的,沒有必要關閉。這種設計本來就是一個非常好的設計,下次啟動程序時,會更快,因為不需要讀取界面資源,何必要關掉他們抹殺這個android的優點呢?(告訴我們如何合理使用進程管理軟件)
        還有一個,為什麼android一個應用看起來那麼耗內存。大家知道,android上的應用是java,當然需要虛擬機,而android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。這樣設計的原因是可以避免虛擬機崩潰導致整個系統崩潰,但代價就是需要更多內存。(跟塞班也不一樣,安卓不容易死機重啟)
         以上這些設計確保了android的穩定性,正常情況下最多單個程序崩潰,但整個系統不會崩潰,也永遠沒有內存不足的提示出現。大家可能是被windows毒害得太深了,總想保留更多的內存,但實際上這並不一定會提升速度,相反卻喪失了程序啟動快的這一系統特色,很沒必要。大家不妨按我說的習慣來用用這個系統。
       祝大家玩機愉快,這系統開十天半個月都沒問題,不是windows。


以下內容為保養方法:

多工系統,Multi-task System
     這個字眼其實是針對使用者和程式開發者多於系統本身,因為這世上沒有一個系統不是多工的。
那麼,為什麼又會有這個術語?
     原因很簡單,因為其實多工指的並非系統本身,而是操作環境。
多工和非多工的操作環境有何分別?
     系統在執行一個程序時,會有以下幾個步驟:
          1. 把主程式放到 RAM 中
          2. 在 RAM 中執行程序
          3. 依照程序的需要,把 RAM 分給該程序使用
     在執行程序時,多工和非多工操作環境是沒有分別的,而分別在程序結束時。
     多工操作環境:
        1. 把分給該程序使用的 RAM 回收
        2. 如程序本身沒有設定自行關閉的話,會把主程式留在 RAM 中
        3. 如該程序沒有工作的話,就會在背景待命,否則就是背景執行。
     非多工操作環境:
        1. 強制關閉該程序
        2. 把分給該程序使用的 RAM 回收
        3. 把主程式從 RAM 中移除,取回記憶體
     說到這裡,多工與非多工的分別大家就會很清楚了。
     這是非多工環境的 Iphone、Featured Phone 和多工環境的 Windows Mobile(WM)、Symbian、Android 最大的分別。
     Iphone 永遠有足夠的 RAM 去給系統運作,所以永保系統運作的順暢度。
     而 WM、Symbian、Android 這類多工系統,在執行一定數量的程序後,系統便會變鈍。

系統內存的變化原理:
首先是因為系統對於每一個用戶使用的界面和後面的背景狀態數據(系統稱為activity),系統希望都能記住,以便用戶下次再用的時候,很快調出來,讓用戶覺得很爽。所以系統企圖記住所有的用過東西。這個是實時系統的設計理念。

   這樣說來,由於系統希望盡可能的在內存中記住所有的activity,導致後果是我們發現手機中的剩餘內存並不會多。除非這個系統很安靜,一直沒有運行什麼程序,例如開機的時候。

   最後內存少到一個臨界點的時候,或者用戶突然運行大的程序,系統通過一定的內存調度算法開始釋放內存,殺掉acitivity。這個原理可以說明我們通過按home鍵換程序 有時候可以回到原來的狀態,有時候不能切換到程序原來的狀態。

   從上面得知可以說明大內存的好處是系統啟動內存調度次數少少,保存的記憶界面多,會較長時間給使用者嗖嗖快的感覺。而內存少的機器只能在較短時間擁有這種感覺,例如開機後或者殺程序後的一段時間內。

    殺程序的內存變化原理:
   對於殺程序我覺得是從linux角度來殺掉進程,即程序的虛擬機,內存被釋放,程序不耗電
   程序自己退出,如果調用finish()退出的,也能釋放內存,不耗電。但是不是這樣退出的就很難說了,例如一些後台程序,例如連雲助手,鬧鐘程序等
   用戶不退出程序,再啟動另外一個程序,那個是耗電的,因為系統在內存中記住了第一個程序的activity,後台還在跑。

SWAP的情況:
   另外說一下Swap情況下,即使TF卡和內存一樣快,總體來說Swap還是慢一點。因為儘管此時總的內存大了,在程序層面不需要頻繁調度activity,但是最底層Linux上還是需要普通的物理內存和虛擬內存之間的頁面調度。
   這個的速度應該是比大內存差些,比小內存好些。但是如果你程序不多,比直接使用小內存還要慢一些

小內存I5700的策略:
1。如果你不使用大程序,同時不使用多個程序。還是不要用Swap。需要記憶的東西本來就不多嗎,這樣每個程序你使用起來理論上是應該很快的。
2. 反之,則用Swap,在複雜的環境中快一些
   3。 另外一個辦法是如果你也不知道自己的使用習慣,你就平常多看看自己的內存余額,長期在25以下,可以考慮使用swap了。
   4.經常殺掉程序,如果你很care自己的運行速度 。其實這個也是可以不用的,系統有自己的調度。除非你慢的實在不行。

早就知道啦

TOP

可能作者也是軟件開發者~ 你明白嗎~  
而且耗電也只輕輕帶過…  

TOP

但係單核如果開得多APPS唔KILL
真係好LAG喎

TOP

但係單核如果開得多APPS唔KILL
真係好LAG喎
ronaldandy 發表於 2012-5-18 22:44


單核都係其次,free ram 先係關鍵
得256MB ram, 俾4核你都無用

TOP