LMK機制(Low Memory Killer)

Low memory killer是Android內(nèi)存清理機制,因移動端設(shè)備的內(nèi)存、性能、電量等因素Android內(nèi)核維護一套內(nèi)存清理機制,就是LMK機制,會定期檢查應(yīng)用內(nèi)存使用情況、殺死一些進程來釋放內(nèi)存,Low memory killer 主要通過進程oom_adj來判定進程重要度,這個值越小程序越重要,被殺死的可能性越低。

1.基本原理和重要概念

Low memory killer根據(jù)兩個原則,進程的重要性和釋放這個進程可獲取的空閑內(nèi)存數(shù)量,來決定釋放的進程。
(1) 進程分類,后面的數(shù)字為oom_adj值,每個進程都有oom_adj值,越小越重要,被殺的可能性越低,在相同oom_adj下內(nèi)存占用大的優(yōu)先被回收。

    名稱            oom_adj值           解釋  
FOREGROUD_APP          0        前臺程序,可以理解為你正在使用的程序 
VISIBLE_APP            1        用戶可見的程序 
SECONDARY_SERVER       2        后臺服務(wù),比如微信會在后臺運行服務(wù) 
HOME_APP               4        HOME,就是主界面 
HIDDEN_APP             7        被隱藏的程序 
CONTENT_PROVIDER       14       內(nèi)容提供者
EMPTY_APP              15       空程序,既不提供服務(wù),也不提供內(nèi)容

(2) Android有兩個數(shù)組,lowmem_adj和lowmen_minfree,lowmem_adj存放著oom_adj的閾值,lowmen_minfree存放minfree的警戒值,單位為頁(一頁4K),通過這兩個數(shù)組計算需要回收的進程。

oom_adj    警戒值
  0        1536 
  1        2048 
  2        4096 
  7        5120 
  14       5632 
  15       6144

(3) LMK檢查的時候基于多個標準來給每個進程評分,對adj高于多少(min_adj)的進程進行分析是否釋放,評分最高的被選中并Kill。

2.進程oom_adj配置

進程的oom_adj是可以配置的,進程的類型在ActivityManagerService中可以看到。
進程類型:

static final int EMPTY_APP_ADJ;
static final int HIDDEN_APP_MAX_ADJ;
static final int HIDDEN_APP_MIN_ADJ;
static final int HOME_APP_ADJ;
static final int BACKUP_APP_ADJ;
static final int SECONDARY_SERVER_ADJ;
static final int HEAVY_WEIGHT_APP_ADJ;
static final int PERCEPTIBLE_APP_ADJ;
static final int VISIBLE_APP_ADJ;
static final int FOREGROUND_APP_ADJ;
static final int CORE_SERVER_ADJ = -12;
static final int SYSTEM_ADJ = -16; 

其中SYSTEM_ADJ代表著系統(tǒng)進程,CORE_SERVER_ADJ為系統(tǒng)核心服務(wù),這類進程永遠不會被殺死,EMPTY_APP、CONTENT_PROVIDER 只類的最容易被殺死,F(xiàn)OREGROUND的進程很難被殺死。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容