Android Low Memory Killer ---1

本來要考試了,已經不打算再弄這些東西了,但是在學習了這個新知識之後我覺得還是有必要和大家分享一下,

所以今天就抽空整理了一下關於minfree閥值的知識,希望對大家有幫助!

      
我們一直聽說
Android是一個多進程操作系統,那麼它是如何處理每一個進程呢?大家可能已經發現

Android自身並沒有所謂的關閉進程的說法.每當我們要退出一個進程回到桌面/打開另一個程序的時候我們只能按

"返回鍵".而當我們按下"返回鍵",該進程並沒有真正的關閉,仍然保存在內存中.這樣在下次調用的時候可以更快的

打開該程序.要想真正的關閉一個已打開的進程,除了用第三方軟件(例如advanced task manager),還有一個,

那就是當Android系統認爲當時已經沒有足夠的內存來運行新的進程,需要關閉一些雖然已經開着,

但是沒有用了(具體怎樣一個進程纔會被Android系統認爲是"沒有用"下面就要討論到)的進程.
理論
而下面要研究的就是這個
Android內部的lowmemorykiller.
     Android
將進程分爲
6個等級,foreground(前臺進程)、visible(可見進程)、secondary server(次要服務)、

hidden(後臺進程)、content provider(內容供應節點)、empty(空進程)它們按優先級順序由高到低依次是:


1. FOREGROUND_APP:
This is the process running the current foreground app.  We'd really rather not kill it!
用戶正在使用的程序這個設的太高,用戶看到得就會是一個正在使用的程序莫名其妙的消失了,然後自動回到桌面..

(因爲它被系統kill..) 所以最好別動它..


2. VISIBLE_APP:
This is a process only hosting activities that are visible to the user, so we'd prefer they don't disappear.
FOREGROUND_APP類似,用戶正在使用/看得到它們的區別就是VISIBLE_APP可能不是用戶focus的程序,

但是用戶看得到,或者沒有覆蓋到整個屏幕,只有屏幕的一部分所以可以適當的比FOREGROUND_APP高一點.


3. SECONDARY_SERVER:
This is a process holding a secondary server -- killing it will not have much of an impact as far as the user is concerned.
所有應用的service. 系統級的service比如PhoneService不屬於這類,它們是絕不會被Android結束掉的.

所以這個可以適當的設高一點點注意, HOME(SenseUI)也包括在這裏 因此還是別設的太高.要不每次返回桌面都得

等它重新load,特別是widget多的..


4. HIDDEN_APP:
This is a process only hosting activities that are not visible, so it can be killed without any disruption.
本來屬於1或者2的程序在用戶按了"back"或者"home",程序本身看不到了,但是其實還在運行的程序,

它們就屬於HIDDEN_APP幹掉沒什麼影響.. 不過要了解並不是所有屬於這一類的就應該馬上結束掉,

push mail,locale,鬧鐘,等都屬於這一類因此還是別設的過高真正"應該"一點返回鍵就退出的程序(真正沒用的程序)

在下面.


5. CONTENT_PROVIDER:
This is a process with a content provider that does not have any clients attached to it.  If it did have any clients, its adjustment 

would be the one for the highest-priority of those processes.

5,6的區別具體不太瞭解..這個也是用處不大,但是還是比EMPTY_APP稍微有點用.. 所以高點沒關係


6. EMPTY_APP:
This is a process without anything currently running in it.  Definitely the first to go! This value is initalized in the constructor, careful when refering to this static variable externally.
完全沒用,殺了它只有好處沒壞處,第一個幹它!
查看現在的設置可以

  • cat /sys/module/lowmemorykiller/parameters/minfree


顯示出的應該是6個數字,以逗號隔開,例如:
1536,2048,4096,5120,5632,6144注意這些數字的單位是page. 1 page = 4 kb.上面的六個數字對應的就是(MB): 6,8,16,20,22,24

這些數字也就是對應的內存閥值,一旦低於該值,Android便開始按順序關閉進程因此Android開始結束優先級最低的EMPTY_APP當可用內存小於24MB(6144*4/1024).
有一點沒搞明白,它的可用內存不知道是從哪得到明顯不是free顯示的可用內存,而且貌似compcacheswap也不影響..

要想重新設置該值

  • echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree


這樣當可用內存低於90MB的時候便開始結束EMPTY_APP. 而當可用內存低於60MB的時候纔開始結束CONTENT_PROVIDER其餘四個沒動.

注意:
通過以上方法改變的數值並非永久.在下次重啓後就又恢復到之前的設置若想讓設置在每次開機執行,將 

  • echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree


加入到任意一個開機啓動的配置文件一般在/system/init.d下的文件都是開機執行的(有的ROM也可能不在這裏..) 只需用記事本打開任意一個文件,再把這行加入其中就好.
實踐

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


首先是軟件,推薦使用MinFreeManager,市場上就有下載,用於設置這六類進程的管理策略。


軟件運行後有六個輸入框,在輸入框中只能輸入數字,這些數字代表了這類進程的處理策略,比如Foreground App下的輸入框顯示6,就表示,當可用內存低於6MB時,終止Foreground App。下面的類似,如Empty App下的輸入框顯示24,則表示,當內存低於24MB時,終止Empty App


從軟件數值的設置不難看出結束進程的有限順序:Empty>Content Provider>Hidden>Secondary Server>Visible>Foreground


但默認設置確存在一些問題:



  • 各類進程的管理策略的閥值相當接近:6816202224,最大的相差也不到8MB,在實際程序運行中,很容易導致多種類型的進程同時被關閉。如可用內存在25時,突然啓動照相程序,系統可用內存急速,可能會導致空進程、內容供應節點、後臺進程、次要服務等同時被關閉

  • 閥值上限較低:一般手機啓動後,可用內存在50-100左右,但隨着手機的使用,可用內存會逐步減少,最後降低到24MB左右,則系統開始啓動進程管理機制,開始結束進程,但這個閥限制設在了24MB,相對來說偏低。其結果會導致系統使用一段時間後,整體速度變慢。很明顯的就是,當手機長時間使用後,開啓電話撥號,相冊,照相機等應用時,系統的反應速度極慢。

  • 設置這個minfree閥值最難的地方是“後臺進程”,設低了,ANDORID不會自動關閉你已經不用的“後臺進程”。設太高的話,會自動關閉你還想用的“後臺進程”,很多服務軟件都是以後臺進程模式提供服務的。



基於以上幾個問題,不難看出,目標也非常明確,主要解決兩個矛盾:



  • 拉開各進程的閥值層次,使得進程管理機制能更有效得工作

  • 提升閥值上限,空出更多的空餘內存,以提升系統整體的運行速度


進程管理策略設置原則:



  • 前臺進程、可見進程和次要服務是與用戶體驗息息相關的內容,這部分的進程管理策略要相對保守,給這些進程留下足夠的運行空間

  • 壓榨無用進程,騰出內存空間給主要程序使用



下面總結了幾種設置方式,適應不同的使用需要:



  • 遊戲玩家/重度瀏覽器使用者配置:

    • 用戶特點:長時間專注於某一特定的,高內存需求的程序,對多任務的需求不高

    • 配置參數:

      • Foreground6

      • Visible8

      • Secondary Server16

      • Hiden App80

      • Content Provider90

      • Empty:100

    • 配置理念:壓榨後臺進程,內容供應節點和空進程,將內存儘可能多得留給前臺進程和系統,提升遊戲速度和瀏覽器體驗

    • 優點:程序啓動和運行的速度最快

    • 缺點:多任務處理不理想,開啓程序較多時,後臺進程會被終止

  • 多任務配置:

    • 用戶特點:同時運行多個應用程序,需要經常在多個程序間切換

    • 配置參數:

      • Foreground6

      • Visible8

      • Secondary Server16

      • Hiden App20

      • Content Provider60

      • Empty:100

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

    • 優點:運行多個程序時,由於可支配內存較多,後臺程序不容易被終止

    • 缺點:程序啓動的速度和整體系統的運行速度可能會比遊戲玩家配置略慢一些,由於經常運行多任務,平時系統的響應速度會受到一定影響

  • 輕度用戶/女生專用配置

    • 用戶特點:手機的主要功能是短信和電話,偶爾用用相機自拍

    • 配置參數:

      • Foreground6

      • Visible8

      • Secondary Server16

      • Hiden App24

      • Content Provider32

      • Empty:48

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

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

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



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