1. 程式人生 > >Android程序管理機制及優化+自動記憶體管理程式

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的程序”。這給了程序管理指令碼的編寫以更多的選擇。

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


實踐

說完理論,說些實踐的東西,怎樣管理這六類程序,如何來設定程序管理模組是這部分說的內容。

首先是軟體,推薦使用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

配置理念:壓榨空程序,給內容供應節點留有一定空間,最大限度提升後臺程式的使用空間,提升多工的處理能力
優點:比較均衡的配置,提升了系統的可用記憶體,使得系統的整體速度得到了提高,拉開了各級程序的管理策略層次,使得管理機制更有效率
缺點:比較均衡的配置,無明顯缺點
總結

闡述完了記憶體管理的機制,並推薦了一些配置引數,但這些引數並不一定適用於所有人,大家也可以根據自己實際的使用習慣調整這些引數的設定。