[2.Android中的lowMemoryKiller機制]
2.1 what is LMK
一種根據(jù)==閾值級別==觸發(fā)相應力度的內(nèi)存回收的機制(源自 Linux OOM Killer)噪服。
Android Kernel每隔一段時間會檢測當前空閑內(nèi)存是否低于某個閥值距误。假如是虑鼎,則殺死oom_adj最大的不必要的進程缸托,如果有多個仅仆,就根據(jù) oom_score_adj 去殺死進程缎玫,庭惜,直到內(nèi)存恢復低于閥值的狀態(tài)
進程有兩個比較重要的狀態(tài)值纺念,即adj(adjustment 定義在ProcessList.java )和procState(定義在ActivityManager.java)。
2.2 進程分5級:
前臺進程(Foreground process)
可見進程(Visible process)
服務進程(Service process)
后臺進程(Background process)
空進程(Empty process)
每個 Java 進程都有一個相關聯(lián)的 ProcessRecord 對象敢会,其成員變量 curAdj 就表示該進程當前狀態(tài)下的優(yōu)先級
2.3 lmkd(Low Memory Killer Daemon) 低內(nèi)存殺手守護進程
Android P 源碼分析 5 - Low memory killer 之 lmkd 守護進程
從 Android 9 開始曾沈,用戶空間 lmkd 會在未檢測到內(nèi)核 lowmemorykiller 驅動程序時激活。請注意鸥昏,用戶空間 lmkd 要求內(nèi)核支持內(nèi)存 cgroup塞俱。因此,要改用用戶空間 lmkd吏垮,您應使用以下配置設置編譯內(nèi)核:
跟大多數(shù)守護進程一樣障涯,lmkd 也是由 init 進程啟動的(socket)
以上整個過程可以簡單總結如下:
- 1.系統(tǒng) Framework 層根據(jù)不同類型進程生命周期控制,動態(tài)分配不同的 adj 值膳汪,并且在一定的時機會對所有進程的 adj 進行更新;
- 2.更新 adj 時唯蝶,==Framework 層會和 lmkd 守護進程進行通==信,修改系統(tǒng) lmk driver 配置的參數(shù)遗嗽,同時設置 /proc/pid/oom_score_adj;
- 3.lowmemorykiller 驅動會被 linux 內(nèi)核的內(nèi)存 ==shrinker== 機制調(diào)度粘我,在 shrinker 操作中,計算進程 adj 和 rss痹换,依據(jù) driver 的 oom_adj 和 minfree 配置征字,進行 kill 進程操作。