Android:內存管理機制

與windows內存區別

在Linux中經常發現空閒內存很少,似乎所有的內存都被系統佔用了,表面感覺是內存不夠用了,其實不然。這是Linux內存管理的一個優秀特性,在這方面,區別於 Windows的內存管理。主要特點是,無論物理內存有多大,Linux都將其充份利用,將一些程序調用過的硬盤數據讀入內存,利用內存讀寫的高速特性來提高Linux系統的數據訪問性能。而Windows是隻在需要內存時,才爲應用程序分配內存,並不能充分利用大容量的內存空間。換句話說,每增加一些物理內存,Linux都將能充分利用起來,發揮了硬件投資帶來的好處,而Windows只將其做爲擺設,即使增加8GB甚至更大。

android內存的意義

其實我們在用安卓手機的時候不用太在意剩餘內存,Android上的應用是Java,當然需要虛擬機,而android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。其實和java的垃圾回收機制類似,系統有一個規則來回收內存。進行內存調度有個閥值,只有低於這個值系統纔會按一個列表來關閉用戶不需要的東西。當然這個值默認設置得很小,所以你會看到內存老在很少的數值徘徊。但事實上他並不影響速度。相反加快了下次啓動應用的速度。這本來就是 android標榜的優勢之一,如果人爲去關閉進程,沒有太大必要。特別是使用自動關進程的軟件。爲什麼內存少的時候運行大型程序會慢呢,原因是:在內存剩餘不多時打開大型程序時會觸發系統自身的調進程調度策略,這是十分消耗系統資源的操作,特別是在一個程序頻繁向系統申請內存的時候。這種情況下系統並不會關閉所有打開的進程,而是選擇性關閉,頻繁的調度自然會拖慢系統。

進程管理軟件

進程管理軟件有無必要呢?有的。就是在運行大型程序之前,你可以手動關閉一些進程釋放內存,可以顯著的提高運行速度。但一些小程序完全可交由系統自己管理。那麼如果不關程序是不是會更耗電。android的應用在被切換到後臺時,它其實已經被暫停了,並不會消耗cpu資源只保留了運行狀態。所以爲什麼有的程序切出去重進會到主界面。但是一個程序如果想要在後臺處理些東西,如音樂播放,它就會開啓一個服務。服務可在後臺持續運行,所以在後臺耗電的也只有帶服務的應用了。我們可以把帶服務的進程用進程管理軟件關閉就可以了。沒有帶服務的應用在後臺是完全不耗電的沒有必要關閉。這種設計本來就是一個非常好的設計,下次啓動程序時會更快,因爲不需要讀取界面資源,何必要關掉他們抹殺這個android的優點呢。

Android進程種類

1.前臺進程(foreground)
目前正在屏幕上顯示的進程和一些系統進程。舉例來說,Dialer,Storage,Google Search等系統進程就是前臺進程;再舉例來說,當你運行一個程序,如瀏覽器,當瀏覽器界面在前臺顯示時,瀏覽器屬於前臺進程(foreground),但一旦你按home回到主界面,瀏覽器就變成了後臺程序(background)。我們最不希望終止的進程就是前臺進程。

2.可見進程(visible)
可見進程是一些不再前臺,但用戶依然可見的進程,舉個例來說:widget、輸入法等,都屬於visible。這部分進程雖然不在前臺,但與我們的使用也密切相關,我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啓動輸入法)

3.桌面進程(home app)
即launcher,保證在多任務切換之後,可以快速返回到home界面而不需重新加載launcher

4.次要服務(secondary server)
目前正在運行的一些服務(主要服務,如撥號等,是不可能被進程管理終止的,故這裏只談次要服務),舉例來說:谷歌企業套件,Gmail內部存儲,聯繫人內部存儲等。這部分服務雖然屬於次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止

5.後臺進程(hidden)
即是後臺進程(background),就是我們通常意義上理解的啓動後被切換到後臺的進程,如瀏覽器,閱讀器等。當程序顯示在屏幕上時,他所運行的進程即爲前臺進程(foreground),一旦我們按home返回主界面(注意是按home,不是按back),程序就駐留在後臺,成爲後臺進程(background)。後臺進程的管理策略有多種:有較爲積極的方式,一旦程序到達後臺立即終止,這種方式會提高程序的運行速度,但無法加速程序的再次啓動;也有較消極的方式,儘可能多的保留後臺程序,雖然可能會影響到單個程序的運行速度,但在再次啓動已啓動的程序時,速度會有所提升。這裏就需要用戶根據自己的使用習慣找到一個平衡點

6.內容供應節點(content provider)
沒有程序實體,進提供內容供別的程序去用的,比如日曆供應節點,郵件供應節點等。在終止進程時,這類程序應該有較高的優先權

7.空進程(empty)
沒有任何東西在內運行的進程,有些程序,比如BTE,在程序退出後,依然會在進程中駐留一個空進程,這個進程裏沒有任何數據在運行,作用往往是提高該程序下次的啓動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最先終止的。

執行條件

剩餘內存小於應用定義的APP_MEM值,開始查看adj值列表,kill相應程序。
轉自:http://blog.csdn.net/chaihuasong/article/details/8289367

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章