進程的一些常識
- 系統(tǒng)出于體驗和性能上的考慮,app在退到后臺時系統(tǒng)并不會真正的kill掉這個進程,而是將其緩存起來。
- 打開的應(yīng)用越多,后臺緩存的進程也越多。
- 在系統(tǒng)內(nèi)存不足的情況下,系統(tǒng)開始依據(jù)自身的一套進程回收機制來判斷要kill掉哪些進程,以騰出內(nèi)存來供給需要的app, 這套殺進程回收內(nèi)存的機制就叫 Low Memory Killer。
Low Memory Killer
- 每一個進程都有一個oom_adj值,進程的oom_adj值由ActivityManagerService根據(jù)運行在進程里面的組件的狀態(tài)來計算
- 進程的oom_adj值取值范圍為[-16,15], oom_adj值越小,就不容易被殺死
- 內(nèi)存緊張時,基于oom_adj值來決定是否要回收一個進程
進程的優(yōu)先級
| 進程 | 優(yōu)先級 |
|---|---|
| 前臺進程 | 關(guān)鍵 |
| 可見進程 | 高 |
| 服務(wù)進程 | 高 |
| 后臺進程 | 低 |
| 空進程 | 低 |
何時殺死進程
內(nèi)存閾值在不同的手機上不一樣,一旦低于該值,Android便會殺死對應(yīng)優(yōu)先級的進程。執(zhí)行命令 cat /sys/module/lowmemorykiller/parameters/minfree,可以看到6個不同的閾值。(內(nèi)存閾值大小不同手機可能會不一樣)
- 18432對應(yīng)前臺進程,23040對應(yīng)可見進程,27648對應(yīng)服務(wù)進程,32256對應(yīng)后臺進程,46080對應(yīng)空進程。第5個值36864為ContentProvider。
- 閾值的單位是4KB,所以計算方法為:46080*4/1024=180MB
- 當(dāng)可用內(nèi)存小于180MB(46080),就殺死空進程。其他閾值類似,到了各自限定的閾值,對應(yīng)級別的進程就會被殺死。

內(nèi)存閾值
通過oom_adj 值,判斷進程的優(yōu)先級,不同手機的oom_adj值可能不一樣。
通過命令行 cat /proc/3199/oom_adj 查看oom_adj值。
(3199為進程pid值,顯示0即可判斷為前臺進程)

查看oom_adj值
各種進程對應(yīng)的oom_adj值

進程oom_adj值