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的進程很難被殺死。