Android 上的記憶體分配策略優化

2021-07-04 13:39:34 字數 2243 閱讀 9614

在android上,其實自身有一套完善的記憶體管理機制。但由於我們深受windows和塞班的毒害,每當看到手機剩餘記憶體只有30m時,就覺得非常不爽,總是希望通過一些工具清理一下記憶體,而當toast顯示已經為你清理500m記憶體時,就會產生無比的快感。比如管家的小火箭發射,就是利用了這種使用者心理。

所以,那些記憶體清理工具在windows上是很有必要的,但在android上,實屬多此一舉。至於程序的優先順序以及memorykiller的管理機制,系統是通過oom_adj來進行管理,這個可以通過之前小管的乙個郵件了解得更詳細。

在android上,主要有6大類程序,分別是foregroud, visible, secondary server, hidden, content provider和empty。它們被kill

的優先順序,依次是emtpy > content provider > hidden > secondary server > visible > foreground。而每一類程序,系統都有乙個閥值,而一旦當閥值達到最大閥值,就會按照上面的順序程序清理程序。

舉例,比如策略為6m, 8m, 16m, 20m, 22m, 24m,當系統剩餘記憶體為22m時,就會先清理empty的程序,如果清理完畢之後,如果剩餘記憶體還足24m, 則繼續清理content provider的程序,如此類推,直到剩餘記憶體達到24m以上為止。

根據各類程序的作用,以及使用者的型別,我們可以配置出各種記憶體分配模式:

1)   長時間只關注某乙個應用,比如遊戲,瀏覽器等——極客模式;

3)   只關注來電,簡訊,郵件等商務——商務模式;

4)   等等。

有root的情況下,通過修改系統檔案/sys/module/lowmemorykiller/parameters/minfree,即可動態修改這六個值。

下面是關於這六類程序的作用簡單介紹, 從網上找到的:

前台程序(foreground):目前正在螢幕上顯示的程序和一些系統程序。舉例來說,dialer storage,google search等系統程序就是前台程序;再舉例來說,當你執行乙個程式,如瀏覽器,當瀏覽器介面在前台顯示時,瀏覽器屬於前台程序(foreground),但一旦你按home回到主介面,瀏覽器就變成了後台程式(background)。我們最不希望終止的程序就是前台程序。

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

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

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

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

空程序(empty):沒有任何東西在內執行的程序,有些程式,比如bte,在程式退出後,依然會在程序中駐留乙個空程序,這個程序裡沒有任何資料在執行,作用往往是提高該程式下次的啟動速度或者記錄程式的一些歷史資訊。這部分程序無疑是應該最先終止的。

當手機剩餘記憶體比較時,手機就變得比較慢的,原因是因為emtpy 的程序的閥值設定得太低了,導致系統在剩餘記憶體很低的情況下,才開始清理程序。當剩餘記憶體比較低,但還沒有達到清理記憶體的條件時,系統整體就會比較卡。

因此,我們的策略,主要是解決兩方面的問題:

1.  

提公升閥值的上限,空出更多的剩餘空間,以提公升系統整體的執行速度;

2.  

各個程序的閥值要拉開,要形成梯度,使得程序管理機制更有效工作;

Memcache 記憶體分配策略

memcached預設採用了名為slab allocator的機制分配和管理記憶體。在該機制出現以前,記憶體的分配是通過對所有記錄簡單的進行malloc和free來進行了。但是這種方式會導致記憶體碎片化嚴重,加重作業系統記憶體管理器的負擔。slab allocator就是位了解決該問題而誕生的。sl...

(八)記憶體分配策略

在虛擬機器中,我們知道物件的記憶體是分配在堆中的。但是堆又可以劃分為更小的區域以便垃圾 那麼,物件到底是怎麼在分配在堆中的呢?大多數情況下,物件都在新生代的eden區中分配記憶體。而因為大部分的物件都是 朝生夕死 的,所以新生代又會頻繁進行垃圾 需要大量連續空間的物件,如 長字串 陣列等,會直接在老...

記憶體分配策略和分配演算法

在為程序分配記憶體時,將涉及到3個問題 1 最小物理塊數的確定 2 物理塊的分配策略 3 物理塊的分配演算法。1 最小物理塊數的確定 這裡所說的最小物理塊數,是指能保證程序正常執行所需的最小物理塊數。當系統為程序分配的物理塊數小於此值時,程序將無法執行。程序應獲得的最少物理塊數與計算機的硬體結構有關...