標(biāo)簽: Low_Memory_Killer 低內(nèi)存管理機(jī)制 系統(tǒng)內(nèi)存管理
Low Memory Killer
Android 系統(tǒng)中運(yùn)行的APP退出到后臺(tái)時(shí)并不會(huì)真正殺死這個(gè)進(jìn)程,而是將其緩存起來(lái)述吸,以便下次能快速啟用(熱啟動(dòng))。在系統(tǒng)內(nèi)存不足情況下蝌矛,系統(tǒng)會(huì)依據(jù)Low Memory Killer機(jī)制來(lái)殺死進(jìn)程;
Low Memory Killer 基本原理
所有進(jìn)程都是從zygote孵化出來(lái)的隆豹,記錄在AMS中mLruProcesses列表中茅逮,由AMS統(tǒng)一管理,AMS中會(huì)根據(jù)進(jìn)程的狀態(tài)更新進(jìn)程對(duì)應(yīng)的oom_adj值献雅,這個(gè)值會(huì)通過(guò)文件傳遞到kernel中,kernel有個(gè)低內(nèi)存回收機(jī)制侯谁,在內(nèi)存達(dá)到一定的閥值時(shí)會(huì)觸發(fā)清理oom_adj值高的進(jìn)程騰出更多內(nèi)存空間
Low Memory Killer 實(shí)現(xiàn)方案
先看android手機(jī)中的倆個(gè)文件
/sys/module/lowmemorykiller/parameters/minfree //文件中每一個(gè)數(shù)字代表一個(gè)內(nèi)存級(jí)別
bullhead:/ # cat /sys/module/lowmemorykiller/parameters/minfree //文件中每一個(gè)數(shù)字代表一個(gè)內(nèi)存級(jí)別
18432,23040,27648,32256,55296,80640
cat /sys/module/lowmemorykiller/parameters/adj //文件中每一個(gè)數(shù)字代表一個(gè)進(jìn)程優(yōu)先級(jí)級(jí)別
bullhead:/ # cat /sys/module/lowmemorykiller/parameters/adj //文件中每一個(gè)數(shù)字代表一個(gè)進(jìn)程優(yōu)先級(jí)級(jí)別
0,100,200,300,900,906
當(dāng)系統(tǒng)剩余內(nèi)存低于80640的時(shí)候章钾,系統(tǒng)會(huì)殺死adj>=906級(jí)別的進(jìn)程
當(dāng)系統(tǒng)剩余內(nèi)存低于55296的時(shí)候,系統(tǒng)會(huì)殺死adj>=900級(jí)別的進(jìn)程
當(dāng)系統(tǒng)剩余內(nèi)存低于32256的時(shí)候伍玖,系統(tǒng)會(huì)殺死adj>=300級(jí)別的進(jìn)程
當(dāng)系統(tǒng)剩余內(nèi)存低于27648的時(shí)候,系統(tǒng)會(huì)殺死adj>=200級(jí)別的進(jìn)程
當(dāng)系統(tǒng)剩余內(nèi)存低于23040的時(shí)候,系統(tǒng)會(huì)殺死adj>=100級(jí)別的進(jìn)程
對(duì)于應(yīng)用進(jìn)程來(lái)說(shuō)丽旅,應(yīng)用進(jìn)程自身也有adj,應(yīng)用進(jìn)程自身adj由AMS負(fù)責(zé)更新邪狞;
ADJ 調(diào)整算法
ActivityManagerService 中三個(gè)核心方法:
updateOomAdjLocked:更新adj,當(dāng)目標(biāo)進(jìn)程為空帆卓,或者被殺則返回false;否則返回true;
computeOomAdjLocked:計(jì)算adj剑令,返回計(jì)算后RawAdj值;
applyOomAdjLocked:應(yīng)用adj,當(dāng)需要?dú)⒌裟繕?biāo)進(jìn)程則返回false吁津;否則返回true。
private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
ProcessRecord TOP_APP, boolean doingAll, long now) {
if (app.thread == null) {
return false;
}
computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now);
return applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime());
}
ADJ更新的地方
即調(diào)用updateOomAdjLocked方法的地方
Activity
- ActivityStackSupervisor.realStartActivityLocked() //啟動(dòng)Activity
- ActivityStack.resumeTopActivityInnerLocked //恢復(fù)棧頂Activity
- ActivityStack.finishSubActivityLocked //finish掉上一個(gè)Activity
- ActivityStack.finishVoiceTask //
- ActivityStack.finishCurrentActivityLocked //結(jié)束當(dāng)前Activity
- ActivityStack.destroyActivityLocked //摧毀當(dāng)前Activity
Service
- ActiveServices.bindServiceLocked //綁定服務(wù)(只更新當(dāng)前app)
- ActiveServices.unbindServiceLocked //解綁服務(wù) (只更新當(dāng)前app)
- ActiveServices.realStartServiceLocked //啟動(dòng)服務(wù)
- ActiveServices.sendServiceArgsLocked //在bringup或則cleanup服務(wù)過(guò)程調(diào)用(只更新當(dāng)前app)
- ActiveServices.bringDownServiceLocked //結(jié)束服務(wù) (只更新當(dāng)前app)
- ActiveServices.removeConnectionLocked //清除掉此進(jìn)程的所有服務(wù)連接
- ActiveServices.serviceDoneExecutingLocked //進(jìn)程服務(wù)出現(xiàn)異常(ANR或其他異常)梭依,移除timeout消息
廣播
- BroadcastQueue.processCurBroadcastLocked //處理當(dāng)前廣播
- BroadcastQueue.deliverToRegisteredReceiverLocked //分發(fā)已注冊(cè)的廣播 (只更新當(dāng)前app)
- BroadcastQueue.processNextBroadcast //處理下一個(gè)廣播
Process
- ActivityManagerService.setSystemProcess //創(chuàng)建并設(shè)置系統(tǒng)進(jìn)程
- ActivityManagerService.appDiedLocked //進(jìn)程死亡
- ActivityManagerService.killAllBackgroundProcesses //殺死所有后臺(tái)進(jìn)程.即(ADJ>900或removed=true的普通進(jìn)程)
- ActivityManagerService.killPackageProcessesLocked //以包名的形式 殺掉相關(guān)進(jìn)程;
- ActivityManagerService.attachApplicationLocked //進(jìn)程創(chuàng)建后attach到system_server的過(guò)程;
- ActivityManagerService.importanceTokenDied // 重要進(jìn)程死亡
- ActivityManagerService.setProcessImportant//例如Toast彈出過(guò)程,設(shè)置進(jìn)程優(yōu)先級(jí)
- ActivityManagerService.getContentProviderImpl //獲取provider (只更新當(dāng)前app)
- ActivityManagerService.removeContentProvider // 移除provider
- ActivityManagerService.publishContentProviders //發(fā)布provider (只更新當(dāng)前app)
- ActivityManagerService.removeContentProviderExternalUnchecked
- ActivityManagerService.publishContentProviders //發(fā)布provider (只更新當(dāng)前app)
- ActivityManagerService.addAppLocked // 創(chuàng)建persistent進(jìn)程
- ActivityManagerService.updateSleepIfNeededLocked //進(jìn)程休眠相關(guān)
- ActivityManagerService.setHasTopUi //
- ActivityManagerService.bindBackupAgent //
- ActivityManagerService.unbindBackupAgent //
- ActivityManagerService.updateProcessForegroundLocked //將app從前臺(tái)進(jìn)程移除
- ActivityManagerService.setAppIdTempWhitelistStateLocked //
- ActivityManagerService.setUidTempWhitelistStateLocked //
- ActivityManagerService.trimApplications //清除沒(méi)有使用app
- ActivityManagerService.setHasOverlayUi //
以上就是Low Memory Killer 調(diào)用地方和算法框架;下篇文章講解Low Memory Killer如何將ADJ參數(shù)傳遞到底層kernel,kernel如何進(jìn)行內(nèi)存回收