1. 程式人生 > >Android記憶體管理機制詳解

Android記憶體管理機制詳解

無意中在MIUI看到的文章,感覺不錯,轉了過來。 原文如下: 最近看到很多機油發帖抱怨記憶體太小程序殺不掉。首先要表示,這個帖子是從百度貼吧轉來的,主要針對正常的安卓機,像里程碑這種悲劇的小記憶體機器,我會另外寫一篇帖子告訴MS的機油們如何將MS用得很流暢,開機全殺100+毫無壓力。
有很多同學表示,自己的機子開機記憶體怎麼只有200m啦,用一會怎麼就變成100多m啦,怎麼有很多程式在後臺關都關不了啦。
首先你要知道Android系統是基於Linux 2.6核心開發的開源作業系統(linux是啥都不知道自己去百度吧),而linux系統的記憶體管理有其獨特的動態儲存管理機制。不過Android系統對Linux的記憶體管理機制進行了優化,Linux系統會在程序活動停止後就結束該程序,而Android把這些程序都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的程序通常情況下不會影響整體系統的執行速度,並且當用戶再次啟用這些程序時,提升了程序的啟動速度


如果你懂java,就會更容易理解Android系統的記憶體管理機制。與java的垃圾回收機制類似,系統有一個規則來回收記憶體。進行記憶體排程有個閾值,只有低於這個值系統才會按一個列表來關閉使用者不需要的東西。Android系統有六類程序:前臺程序、可見程序、次要服務、後臺程序、內容供應節點、空程序。對於高手而言可以用MinFreeManager之類的軟體進行程序管理,分別為六類程序設定不同的閾值來操縱系統的記憶體分配機制。不過對於一般使用者而言,Android系統預設的分配機制已經可以滿足使用需要,因此也不需要再去調整。

對於一些記憶體很低的低端Android機而言,系統預設的記憶體分配機制無法實現很完善的記憶體調配。所以在執行大型遊戲時需要先清理一下記憶體。然而對於我們的ANDROID系統的手機而言,幾百m的總記憶體和幾十m的空餘記憶體已經可以充分的滿足系統自動調配的需要,因此完全沒有必要老去殺程序、清記憶體


有的兄弟說後臺掛著程式很費電,事實上Android的應用在被切換到後臺時,它其實已經被暫停了,並不會消耗cpu資源,只保留了執行狀態。至於QQ、音樂播放之類的程式可以在後臺執行,是因為這些程式在後臺開啟了服務,而服務可以後臺執行,所以沒有帶服務的應用在後臺是完全不耗電的,沒有必要關閉。
這種設計本來就是一個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源。

Android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理記憶體的同學完全是因為被塞班或者Windows毒害太深,事實上,經常用Taskiller之類的軟體關閉後臺所有程序,很容易造成系統的不穩定
。很多時候出現問題,只要重啟就能解決,其原因也在於此。

說了這麼多,總結起來很簡單,牛B的人自己去操縱系統記憶體分配的閾值,而普通使用者則是想怎麼用就怎麼用,完全不用去鳥剩餘記憶體的問題,那些記憶體清理的程式完全可以扔到一邊了。
後面附上一個很好用的分配系統閾值的工具autokiller,對於如果有同學真的那麼喜歡看著自己手機的剩餘ram很大的話,可以用這個工具,這個工具的原理不是殺程序,而是分配系統記憶體閾值,很簡單很好用。

PS:

1.按home退出,程式保留狀態為後臺程序;按返回鍵退出,程式保留狀態為空程序。空程序的oom_adj評值高於後臺程序,更容易被系統清理。所以推薦用返回鍵退出。

2.UC、憤怒小鳥、都市賽車之類程式本身提供關閉功能的,還是儘量主動關閉。瀏覽器、電子市場、opera mini等不提供關閉功能的,直接返回鍵退出就行。


Android 是如何管理程序的
在Android裡,程序和程式是兩回事,程式可以一直保留在系統裡,但是沒有任何程序在後臺“執行”,也不消耗任何系統資源。所有的程式保留在記憶體中,所有可以更快的啟動回到它之前的狀態。當你的記憶體用完了,系統會自動幫你殺掉你不用的任務。
需要明白的是,
Android用RAM的方式,跟windows啥的是兩回事。在Android的世界裡面,RAM被用滿了是件'好'事。它意味著你可以快速開啟之前開啟的軟體,回到之前的位置。所以Android很有效的使用RAM,很多使用者看到他們的RAM滿了,就認為拖慢了他們的電話。而實際上,是你的CPU——當你的軟體真正執行時用到的東東——才是拖慢手機的瓶頸。
為啥說程序管理軟體是禍害
很流行的各種程序管理軟體都說幫你釋放記憶體是件好事,但這是不正確的。開啟這些軟體時,他們告訴你“執行”的軟體和殺死他們的方法。你也可以在“服務”裡面看到到底程式的哪些部分在“執行”,佔用了多少記憶體,剩餘多少記憶體。所有的這些都告訴你,殺掉這些程式能夠釋放記憶體。但是這些軟體都沒有告訴你這些程式到底消耗了多少CPU時鐘,而僅僅告訴你能釋放多少記憶體。
要知道,用滿了記憶體實際上是件好事,我們要注意的是CPU,真正消耗你的手機資源,消耗電池的東東。
因此,殺掉程式通常是沒有必要的(尤其是用"autokill"方式殺掉程式)。更嚴重的是,這樣做會更快的拖垮你的手機能力和電池效能。不管是手動殺掉程序,還是自動的殺掉程序,重新開啟程式,你實際上是在用CPU資源來做這件事。
事實上,這些程序管理軟體消耗了系統資源。而且,這些軟體會莫名其妙的殺死其他程式造成亂七八糟的結果(尤其對些小白來說)。所有的這些,告訴我們,你的手機在用它自己的方式工作,特別是你只是個小白使用者,用這些程序管理軟體耽誤的事情比得到的要多。

那麼你應該怎麼做呢
這麼說吧,各種程式開發水平是不一樣的。很多人以前或者現在使用這些程序管理軟體,釋放記憶體,感覺手機快了那麼一點。造成這個問題的原因是,你用的軟體本身程式寫得太爛了,比如,有得程式完全沒有必要聯網時,還在聯著。這個時候,殺掉這些程式,你能得到好處,就是說,只有你知道你在幹什麼得時候,殺掉讓你愛但是很爛的程式才能幫上你。
事實上 ,很多開發者,包括ROM開發者,如果用了程序管理程式,當你提交bug報告時,看都不會看一眼(Cyanogen 時這麼幹的,我不知道MIUI是不是),所以能不用就不要用了,除非你真的知道你在幹什麼。
如果你真關係你的手機的表現和程序,還是多關注下系統程序,看看裡面說各種程式都消耗了多少資源,如果某個程式消耗太多,時不時殺掉它可能會有那麼一點幫助。
總的來說,程序管理軟體正確的用途是殺那些出錯的程式、會導致宕機有BUG的程序以及疑似病毒程序等,而不是一味地追求記憶體空得多程式在記憶體裡放著,CPU不呼叫,它就是死的,一般程式你退出了它就不再運行了,不佔用CPU資源(佔用了CPU時間這個才是要耗電的),這就是2.2以上版本系統那個“快速啟動”的工作原理。