天天看點

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,在程式退出後,依然會在程序中駐留一個空程序,這個程序裡沒有任何資料在運作,作用往往是提高該程式下次的啟動速度或者記錄程式的一些曆史資訊。這部分程序無疑是應該最先終止的。