Low Memory Killer
Android的Low Memory Killer是在標準linux kernel的OOM(Out Of Memory)基礎上修改而來的一種內存管理機制,當系統內存不足時,殺死Bad進程釋放其內存。Bad進程的選擇標準有兩個:oom_adj和佔用內存的大小。oom_adj代表進程的優先級,數值越大,優先級越高,對應每個oom_adj都有一個空閒內存的閾值。Android Kernel每隔一段時間會檢查當前空閒內存是否低於某個閾值,如果是,則殺死oom_adj最大的Bad進程,如果有兩個以上Bad進程oom_adj相同,則殺死其中佔用內存最多的進程。
OOM是標準linux Kernel的一種內存管理機制,Low Memory Killer在它基礎上作了改進:
(1) OOM基於多個標準給每個進程打分,分最高的進程將被殺死;Low Memory Killer則用oom_adj和佔用內存的大小來選擇Bad進程.
(2) OOM在內存分配不足時調用,而Low Memory Killer每隔一段時間就會檢查,一旦發現空閒內存低於某個閾值,則殺死Bad進程。
oom_adj/oom_score:
這兩個是與linux的OOM機制有關的文件,oom_adj相當於一個因子,它值越大,在OOM時更容易被系統kill掉,但最終決定是否被kill的是oom_score,其實計算這個oom_score時,就是根據oom_adj來的,oom_adj更大,計算出來的oom_score就更大,也能容易在OOM時被系統kill掉。當然如果是很重要的服務現場,爲了避免出現這種情況設置oom_adj=0就行,表示永遠不會因爲OOM被kill。
Android將進程分爲6個等級,它們按優先級順序由高到低依次是:
2.可視進程(VISIBLE_APP )
3. 次要服務進程(SECONDARY_SERVER)
4.後臺進程 (HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)
怎樣設置使一個應用不被系統殺死:
對於放在/system/app下的應用,需要在其Manifest.xml文件中設置persistent屬性,如應用程序'Phone'的AndroidManifest.xml文件:
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升爲系統核心級別,任何情況下不會被kill掉,settings->applications裏面也會屏蔽掉stop操作。
鏈接:http://blog.sina.com.cn/s/blog_6f7ce0e60100viip.html