參考文章:
一、理論:
android採取了一種有別於linux的程序管理策略,有別於linux的在程序活動停止後就結束該程序,android把這些程序都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的程序通常情況下不會影響整體系統的執行速度,並且當使用者再次啟用這些程序時,提公升了程序的啟動速度。
那android什麼時候結束程序?結束哪個程序呢?如何阻止被結束?
android記憶體管理機制:
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.後台程序(background):雖然作者用了hidden這個詞,但實際即是後台程序(background),就是我們通常意義上理解的啟動後被切換到後台的程序,如瀏覽器,閱讀器等。當程式顯示在螢幕上時,他所執行的程序即為前台程序(foreground),一旦我們按home返回主介面(注意是按home,不是按back),程式就駐留在後台,成為後台程序
(background)。後台程序的管理策略有多種:有較為積極的方式,一旦程式到達後台立即終止,這種方式會提高程式的執行速度,但無法加速程式的再次啟動;也有較消極的方式,盡可能多的保留後台程式,雖然可能會影響到單個程式的執行速度,但在再次啟動已啟動的程式時,速度會有所提公升。這裡就需要使用者根據自己的使用習慣找到乙個平衡點
5.內容**節點(content provider):沒有程式實體,進提供內容供別的程式去用的,比如日曆**節點,郵件**節點等。在終止程序時,這類程式應該有較高的優先權
6.空程序(empty):沒有任何東西在內執行的程序,有些程式,比如bte,在程式退出後,依然會在程序中駐留乙個空程序,這個程序裡沒有任何資料在執行,作用往往是提高該程式下次的啟動速度或者記錄程式的一些歷史資訊。這部分程序無疑是應該最先終止的。
三、實戰:
1、檢視當前系統各類程序的閾值:
使用root使用者執行: cat /sys/module/lowmemorykiller/parameters/minfree
顯示出的應該是6個數字,以逗號隔開,例如:1536,2048,4096,5120,5632,6144
但預設設定確存在一些問題:
各類程序的管理策略的閥值相當接近:6,8,16,20,22,24,最大的相差也不到8mb,在實際程式執行中,很容易導致多種型別的程序同時被關閉。如可用記憶體在25時,突然啟動照相程式,系統可用記憶體急速,可能會導致空程序、內容**節點、後台程序、次要服務等同時被關閉,閥值上限較低:一般手機啟動後,可用記憶體在50-100左右,但隨著手機的使用,可用記憶體會逐步減少,最後降低到24mb左右,則系統開始啟動程序管理機制,開始結束程序,但這個閥限制設在了24mb,相對來說偏低。其結果會導致系統使用一段時間後,整體速度變慢。很明顯的就是,當手機長時間使用後,開啟**撥號,相簿,照相機等應用時,系統的反應速度極慢。
基於以上幾個問題,不難看出,我們修改的目標也將非常明確,主要解決兩個矛盾:
拉開各程序的閥值層次,使得程序管理機制能更有效得工作
提公升閥值上限,空出更多的空餘記憶體,以提公升系統整體的執行速度
如何拉開不同程序的閾值呢?
程序管理策略設定原則:
①、前台程序、可見程序和次要服務是與使用者體驗息息相關的內容,這部分的程序管理策略要相對保守,給這些程序留下足夠的執行空間
②、壓榨無用程序,騰出記憶體空間給主要程式使用
完全讓程序不被kill是不可能的,我們可以通過一些操作,使程序被kill的機率變小:
①、提高程序的優先順序:後台操作採用執行於前台的service形式,因為乙個執行著service的程序比乙個執行著後台activity的等級高;
按back鍵使得程序中的activity在後台執行而不是destory,需過載back按鍵(沒有任何activity在執行的程序優先被殺).依賴於其他優先順序高的程序。
②、強制修改程序屬性:在程序中設定:setpersistent(true)或在manifest檔案中設定:android:persistent="true"
Android記憶體程序管理機制
參考文章 一 理論 android採取了一種有別於linux的程序管理策略,有別於linux的在程序活動停止後就結束該程序,android把這些程序都保留在記憶體中,直到系統需要更多記憶體為止。這些保留在記憶體中的程序通常情況下不會影響整體系統的執行速度,並且當使用者再次啟用這些程序時,提公升了程序...
Android 記憶體管理機制
無意中在miui看到的文章,感覺不錯,轉了過來。原文如下 這種設計本來就是乙個非常好的設計,下次啟動程式時,會更快,因為不需要讀取介面資源。android系統這樣的設計不僅非常適合移動終端的需要,而且減少了系統崩潰的可能,確保了系統的穩定性。老想著清理記憶體的同學完全是因為被塞班或者windows毒...
Android 記憶體管理機制
本文 android 記憶體管理機制是android開發者必須要懂得的,是實現上層應用的基礎。下面就來談一談。以上這些設計確保了安卓android的穩定性,正常情況下最多單個程式崩潰,但整個系統不會崩潰,也永遠沒有記憶體不足的提示出現.大家可能是被windows毒害得太深了,總想保留更多的記憶體,但...