進程相關(guān)知識梳理

進程?;钆c拉活

進程的一些常識

  • 系統(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值
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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