手機的設備,由於內存有限,若沒有處理好內存也會導致 OOM (Out Of Memory)
但是許多的程序都會有緩存機制(eg. Activity#finish 也不會立刻清除),這種機制是可以加快程序的啟動,減少反覆創建,不過相對來說就會一直佔用著內存
Linux 內核有自己的監控機制,就是 OOMKiller,在系統塊到達內存臨界點時 這個 OOM 的管理會自動跳出來清理背景程序(依照策不同會回收不同對象的記憶體)
一般來說會依照優先順序,從最不重要的進程開始殺,當然也會考慮到以下幾點
Linux 可以透過 /proc(映射內存產生的數據,並不是真正資料) 資料夾查看對應的 oom_adj
/proc/<PID\>/oom_adj
& /proc/<PID\>/oom_score
(score 越低則越晚被回收資源),下圖則代表 PID 為 8270 的程序不容易被回收
Android 系統也是基於 Linux's OOMKiller 的核心思想,實現了不同階級的 Killer
Source code 在 / drivers / staging / android / lowmemorykiller.c
,在初始化時會註冊一個 shrinker 回調,當記憶體到達臨界點時就會呼叫 lowmem_shrinker
adj 值 | 描述 | 說明 |
---|---|---|
15 | HIDDEN_APP_MAX_AD | 當前運行不可見的 aCTIVITY 進程 |
9 | HIDDEN_APP_MIN_ADJ | 同上 |
8 | SERVICE_B_ADJ | B list of srvice,與 A list 相比,他們對用戶的黏合更低 |
7 | PREVIOUS_APP_ADJ | 與用戶前一次互交的進程,也就上次一次使用的程序 |
6 | HOME_APP_ADJ | Launch 進程(桌面程序) |
5 | SERVCIE_ADJ | 當前運行了 Application service 進程 |
4 | BACK_UP_ADJ | 專門於 backup 相關操作的進程 |
3 | HEAVY_WEIGHT_APP_ADJ | 重量級程序 |
2 | PERCEPTIBLE_APP_ADJ | 用戶可以感覺到,但是不可見到(後台運行)Eg. 音樂播放 |
1 | VISIBLE_APP_ADJ | 前台可見的 Activity 進程 |
0 | FOREGROUND_APP_ADJ | 當前正在使用(前台運行)的進程 |
-12 | PERSISTENT_PROC_ADJ | Persistent 進程,Eg. telephony |
-16 | SYTEM_ADJ | 系統進程 |
Android 系統提供了對應的文件讓我們修改
ActivityManagerService (AMS) 有一個 updateOomLevels 的函數,它的內部實現原理也是通過寫上面兩個文件來實現的
Android 系統