Android內存管理

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個等級,它們按優先級順序由高到低依次是:
 

  1.前臺進程( FOREGROUND_APP)
  2.可視進程(VISIBLE_APP )
  3. 次要服務進程(SECONDARY_SERVER)
  4.後臺進程 (HIDDEN_APP)
  5.內容供應節點(CONTENT_PROVIDER)
  6.空進程(EMPTY_APP)

怎樣設置使一個應用不被系統殺死:
對於放在/system/app下的應用,需要在其Manifest.xml文件中設置persistent屬性,如應用程序'Phone'的AndroidManifest.xml文件:
 
  <application android:name="PhoneApp"
                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


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