1. 程式人生 > >android 可用記憶體的閥值--轉載

android 可用記憶體的閥值--轉載

我們一直聽說Android是一個多程序作業系統,那麼它是如何處理每一個程序呢? 
大家可能已經發現 Android自身並沒有所謂的關閉程序的說法 每當我們要退出一個程序回到桌面/開啟另一個程式的時候我們只能按"返回鍵". 而當我們按下"返回鍵"後,該程序並沒有真正的關閉,仍然儲存在記憶體中. 這樣在下次呼叫的時候可以更快的開啟該程式.}

要想真正的關閉一個已開啟的程序,除了用第三方軟體(例如advanced task manager)外,還有一個,那就是當Android系統認為當時已經沒有足夠的記憶體來執行新的程序,需要關閉一些雖然已經開著,但是沒有用了(具體怎 樣一個程序才會被Android系統認為是"沒有用"下面就要討論到)的程序.

而下面要研究的就是這個Android內部的lowmemorykiller.

ActivityManagerService.java記錄著每一個程序的優先順序. 一個程序的oom_adj值也就代表了它的優先順序. oom_adj值越高代表該程序優先順序越低. 一個正在使用的程序的oom_adj值為0,一旦我們按下返回鍵,這個程序就會得到一個更高的oom_adj值(更低的優先順序). 具體多少取決於該程序在LRU(last recently used) list的位置.(未證實)
具體的細節儲存在Android原始檔drivers/misc/lowmemorykiller.c裡.

Android將程序分為6個等級,它們按優先順序順序由高到低依次是:

    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.8 b2 ]  ]; p5 N; S
    跟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.
完全沒用的一個,殺了它只有好處沒壞處,第一個幹它

檢視現在的設定可以:
1. # cat /sys/module/lowmemorykiller/parameters/minfree

複製程式碼'
顯示出的應該是6個數字,以逗號隔開,例如:
1536,2048,4096,5120,5632,6144

注意這些數字的單位是page. 1 page = 4 kilobyte.;
上面的六個數字對應的就是(MB): 6,8,16,20,22,24

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

要想重新設定該值:

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

複製程式碼
這樣當可用記憶體低於90MB的時候便開始結束EMPTY_APP. 而當可用記憶體低於60MB的時候才開始結束CONTENT_PROVIDER組. 其餘四個沒動.

注意:
通過以上方法改變的數值並非永久.在下次重啟後就又恢復到之前的設定. 若想讓設定在每次開機執行,將"
1. echo "1536,3072,4096,21000,23000,25000" > /sys/module/lowmemorykiller/parameters/minfree

複製程式碼
加入到任意一個開機啟動的配置檔案. 一般在/system/init.d下的檔案都是開機執行的(有的ROM也可能不在這裡..) 只需用記事本開啟任意一個檔案,再把這行加入其中就好.

原作者做了一個應用,在market裡免費,讓大家更改設定更方便,叫 "MinFreeManager".

上面給出的數字只供參考,具體多少才是最優組合正在研究中..

也許大家還不明白這樣做的好處. 這樣的好處就是讓我們隨時有足夠的記憶體來執行我們要執行的程式,而那些真正沒用的程序又不會多餘的佔用著寶貴的記憶體. 更重要的是這一切都是不需要您的參與或任何第三方軟體的協助,完全由Android在後臺自動執行. 試想,又有誰會比Android更熟悉的掌握每個程序呢 比起那些記憶體管理程式傻傻的一鍋端的方法聰明多了吧~ 讓我們從現在開始把那些記憶體管理程式刪掉吧