星期六, 10月 29, 2011

Android 記憶體管理的知識

原文地址:http://bbs.hiapk.com/viewthread.php?tid=849729&extra=&page=1

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的所有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的進程」。這給了進程管理腳本的編寫以更多的選擇。





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


配置理念:壓榨空進程,給內容供應節點留有一定空間,最大限度提升後台程序的使用空間,提升多任務的處理能力


優點:比較均衡的配置,提升了系統的可用內存,使得系統的整體速度得到了提高,拉開了各級進程的管理策略層次,使得管理機制更有效率


缺點:比較均衡的配置,無明顯缺點

沒有留言: