亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android操作系統之內存回收策略

2020-04-11 11:00:15
字體:
來源:轉載
供稿:網友

Android 是一款基于 Linux 內核,面向移動終端的操作系統。為適應其作為移動平臺操作系統的特殊需要,谷歌對其做了特別的設計與優化,使應用程序關閉但不退出,并由操作系統進行進程的回收管理。本文在 Application Framework 與 Linux 內核兩個層次上,以進程為粒度,對 Android 操作系統的進程資源回收機制進行了剖析。讀者可以從本文獲得對 Android 應用程序的生存周期的進一步理解,從而更加合理、高效地構建應用程序。

Android 操作系統中的內存回收可分為兩個層次:

1、默認內存回收、即Application Framework 層的默認回收。

2、內核級內存回收。

Linux 內核中的內存回收 lowmemorykiller、OOM_killer。

默認內存回收:(代碼可查閱 ActivityManagerService.java類)回收動作入口activityIdleInternal()。

Android 系統中內存回收的觸發點大致可分為三種情況。

第一,用戶程序調用 StartActivity(), 使當前活動的 Activity 被覆蓋;

第二,用戶按 back 鍵,退出當前應用程序;第三,啟動一個新的應用程序。

這些能夠觸發內存回收的事件最終調用的函數接口就是 activityIdleInternal()。當 ActivityManagerService 接收到異步消息 IDLE_TIMEOUT_MSG 或者 IDLE_NOW_MSG 時,activityIdleInternal() 將會被調用。 IDLE_NOW_MSG 由 Activity 的切換以及 Activiy 焦點的改變等事件引發,IDLE_TIMEOUT_MSG 在 Activity 啟動超時的情況下引發,一般這個超時時間設為 10s,如果 10s 之內一個 Activity 依然沒有成功啟動,那么將發送異步消息 IDLE_TIMEOUT_MSG 進行資源回收。activityIdleInternal() 的主要任務是改變系統中 Activity 的狀態信息,并將其添加到不同狀態列表中。它的主要工如下:

首先,調用 scheduleAppGcsLocked() 方法通知所有進行中的任務進行垃圾回收。scheduleAppGcsLocked() 將進行調度 JVM 的 garbage collect,回收一部分內存空間,這里僅僅是通知每個進程自行進程垃圾檢查并調度回收時間,而非同步回收。

然后,取出 mStoppingActivities 和 mFinishigActivities 列表中的所有內容,暫存在臨時變量中。這兩個列表分別存儲了當前狀態為 stop 和 finishi 的 activity 對象。對于 stop 列表,如果其中的 activity 的 finish 狀態為 true,判斷是不是要立即停止,如果要立即停止則調用 destroyActivityLocked() 通知目標進程調用 onDestroy() 方法,否則,先調用resumeTopActivity() 運行下一個 Activity。如果 finish 狀態為 false,則調用 stopActivityLocked() 通知客戶進程停止該 Activity,這種情況一般發生在調用 startActivity() 后。對于 finish 列表,直接調用 destroyActivityLocked() 通知客戶進程銷毀目標 Activity。這里的 destroyActivityLocked 等函數并沒有真正意義上改變內存的使用,只是將其狀態改變為“允許回收”,真正的回收在下面即將調用的 trimApplications() 函數中。

private final void trimApplications() {synchronized (this) {// First remove any unused application processes whose package// has been removed.for (i=mRemovedProcesses.size()-1; i>=0; i--) {(1)//kill process;}if (!updateOomAdjLocked()) {(2)//do something default}// Finally, if there are too many activities now running, try to// finish as many as we can to get back down to the limit.(3)do something}}

(1)當程序執行到 trimApplications() 之后,首先檢查 mRemovedProcesses 列表中的進程。mRemovedProcesses 列表中主要包含了 crash 的進程、5 秒內沒有響應并被用戶選在強制關閉的進程、以及應用開發這調用 killBackgroundProcess 想要殺死的進程。調用 Process.killProcess 將所有此類進程全部殺死。

(2)調用 updateOomAdjLocked() 函數,若成功返回,說明 Linux 內核支持 setOomAdj() 接口,updateOomAdjLocked 將修改 adj 的值并通知 linux 內核,內核根據 adj 值以及內存使用情況動態管理進程資源(lowmemorykiller 和 oom_killer)。若 updateOomAdjLocked() 返回為假,則表示當前系統不支持 setOomAdj() 接口,將在本地進行默認的資源回收。

(3)最后,如果當前依然運行了過多的 Activity,對多余的 Activity 進行回收。 trimApplications() 的大多數的代碼都在處理 Oom_killer 不存在情況下的默認資源回收,下面對其默認回收過程(即代碼中標記(2)的位置)進行進一步分析。其回收過程可大致描述如下。

步驟一,獲取當前所有運行的進程 mLruProcesses,mLruProcesses 中的排序規則是按最近使用時間。對 mLruProcesses 中不能被關閉的進程進行計數,這些不能被關閉的進程包括運行 service 的進程,運行broadcast receiver 的進程等。

步驟二, 設當前最大運行進程數 curMaxProcs = curMaxProcs + numServiceProcs(即默認最大進程數與運行 Service 的進程數之和),如果當前進程的數量 mRemovedProcesses.size() 大于這個值,則遍歷所有當前運行的進程,殺死符合條件的那些進程并釋放內存。進程被殺死的條件是:必須是非 persistent 進程,即非系統進程,必須是空進程,即進程中沒有任何 activity 存在。如果殺死存在 Activity 的進程,有可能關閉用戶正在使用的程序,或者使應用程序恢復的時延變大,從而影響用戶體驗;必須無 broadcast receiver。運行 broadcast receiver 一般都在等待一個事件的發生,用戶并不希望此類程序被系統強制關閉;進程中 service 的數量必須為 0。存在 service 的進程很有可能在為一個或者多個程序提供某種服務,如 GPS 定位服務。殺死此類進程將使其他進程無法正常服務。

步驟三,再次檢查當前運行的進程,如果 mRemovedProcesses.size() 仍然大于 curMaxProcs,則放寬條件再次進行回收。

步驟四,上面 3 個過程都是針對整個 process 進行的資源回收。在以上過程執行完畢之后,將在更小的粒度上對 Activity 的資源進行回收。與上面所述類似,列表 mLRUActivities 存儲了當前所有運行中的 Activity,排序規則同樣為最少訪問原則。mLRUActivities.size() 返回系統中運行的 Activity 的數量,當其大于 MAX_ACTIVITIES(MAX_ACTIVITIES 是一個常量,一般值為 20,代表系統中最大允許同時存在的 Activity)時。將回收部分滿足條件的 Activity 以減少內存的使用。 這里回收的只是 Activity 的內存資源,并不會殺死進程,也不會影響進程的運行。當進程需要調用被殺掉的 Activity 時,可以從保存的狀態中回復,當然可能需要相對長一點的時延。

Linux 內核中的內存回收

lowmemorykiller

trimApplications() 函數中會執行一個叫做 updateOomAdjLocked() 的函數,如果返回 false,則執行默認回收,若返回 true 則不執行默認內存回收。
updateOomAdjLocked 將針對每一個進程更新一個名為 adj 的變量,并將其告知 Linux 內核,內核維護一個包含 adj 的數據結構(即進程表),并通過 lowmemorykiller 檢查系統內存的使用情況,在內存不足的情況下殺死一些進程并釋放內存。

由于 Android 操作系統中的所有應用程序都運行在獨立的 Dalvik 虛擬機環境中,Linux 內核無法獲知每個進程的運行狀態,也就無法為每個進程維護一個合適的 adj 值,因此,Android Application Framework 中必須提供一套機制以動態的更新每個進程的 adj。這就是 updateOomAdjLocked()。

Android 基于進程中運行的組件及其狀態規定了默認的五個回收優先級

IMPORTANCE_FOREGROUND:
IMPORTANCE_VISIBLE:
IMPORTANCE_SERVICE:
IMPORTANCE_BACKGROUND:
IMPORTANCE_EMPTY:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品午夜一区二区欲梦| 日韩av手机在线看| 草民午夜欧美限制a级福利片| 亚洲精品第一国产综合精品| 亚洲自拍偷拍色图| 欧美性xxxx极品高清hd直播| 精品久久久久久久久久久久久| 精品夜色国产国偷在线| 久久久久久午夜| 欧美亚洲免费电影| 亚洲精品中文字幕女同| 久久精品99久久香蕉国产色戒| 久久久久久噜噜噜久久久精品| 久久久久久久激情视频| 51午夜精品视频| 日韩精品高清视频| 欧美激情xxxx性bbbb| 精品日本高清在线播放| 九九精品在线播放| 91亚洲精品久久久久久久久久久久| 51精品在线观看| 亚洲国产日韩精品在线| 成人午夜小视频| 日韩亚洲成人av在线| 日韩亚洲精品电影| 午夜免费久久久久| 91精品久久久久久久久青青| 欧美激情一级精品国产| 日韩欧美国产激情| 欧美性猛交xxxx免费看久久久| 韩国三级电影久久久久久| 国产精品69久久久久| 欧美性xxxxx极品娇小| 亚洲一区二区三区在线免费观看| 亚洲无线码在线一区观看| 精品无人区乱码1区2区3区在线| 欧美一级成年大片在线观看| 九九视频这里只有精品| 欧美大片免费观看在线观看网站推荐| 欧美视频免费在线观看| 福利微拍一区二区| 国产日韩综合一区二区性色av| 久久99久久久久久久噜噜| 国产成人精品久久二区二区| 欧美激情国产日韩精品一区18| 国产欧美日韩综合精品| 久久免费视频在线观看| 亚洲一区999| 国产亚洲成精品久久| 黑人与娇小精品av专区| 欧美中文在线免费| 欧美日韩在线观看视频| 91av在线播放| 欧美成人中文字幕在线| 精品国产一区二区三区久久狼5月| 美女视频黄免费的亚洲男人天堂| 成人福利网站在线观看| 日韩电影中文字幕在线观看| 91视频免费在线| 久久人人爽人人爽人人片av高请| 性欧美在线看片a免费观看| 精品爽片免费看久久| 国产精品白丝jk喷水视频一区| 成人欧美一区二区三区在线湿哒哒| 欧美激情亚洲综合一区| 久久久久久91香蕉国产| 伊人青青综合网站| 日韩精品极品在线观看| 91成人天堂久久成人| 欧美xxxwww| 中文字幕久热精品视频在线| 日韩电影中文字幕av| 久久国产色av| 2023亚洲男人天堂| 97人人做人人爱| 亚洲性生活视频在线观看| 国产精品色午夜在线观看| 精品无人国产偷自产在线| 成人免费看片视频| 奇米成人av国产一区二区三区| 欧美裸体xxxx极品少妇软件| 亚洲图片欧美午夜| 久久久之久亚州精品露出| 亚洲欧美在线播放| 国模极品一区二区三区| 久久久精品影院| 全球成人中文在线| 国产精品美乳一区二区免费| 亚洲国产精品中文| 在线中文字幕日韩| 亚洲国产中文字幕在线观看| 久久久久久国产精品| 日韩视频永久免费观看| 欧美壮男野外gaytube| 国产精品第七十二页| 久久综合伊人77777| 日韩欧美第一页| 久久色免费在线视频| 欧洲中文字幕国产精品| 九九久久综合网站| 亚洲一区二区免费| 日本欧美精品在线| 欧美激情视频在线免费观看 欧美视频免费一| 美女福利视频一区| 日韩av片免费在线观看| 亚洲欧美在线一区二区| 亚洲成年网站在线观看| 久久国产精品偷| 91精品综合视频| www.午夜精品| 日韩视频―中文字幕| 国产精品吊钟奶在线| 国产成人精彩在线视频九色| 日本19禁啪啪免费观看www| 亚洲综合中文字幕在线| 亚洲综合在线中文字幕| 久久色免费在线视频| 亚洲欧美日韩在线一区| 97精品免费视频| 中文字幕精品影院| 一区二区在线视频| 亚洲综合中文字幕在线| 亚洲精品免费在线视频| 国产精品美女视频网站| 亚洲激情久久久| 亚洲va久久久噜噜噜| 韩国19禁主播vip福利视频| 欧美精品性视频| 亲爱的老师9免费观看全集电视剧| 日韩第一页在线| 国产精品丝袜视频| 久久精品视频网站| 精品av在线播放| 在线免费观看羞羞视频一区二区| 久久精品国产69国产精品亚洲| 亚洲第五色综合网| 色狠狠久久aa北条麻妃| 国产69精品久久久久久| 亚洲成av人影院在线观看| 精品国产区一区二区三区在线观看| 成人黄色激情网| 国产日韩欧美自拍| 欧美日韩亚洲激情| 亚洲欧美综合另类中字| 欧美www视频在线观看| 一区二区三区日韩在线| 亚洲色图偷窥自拍| 欧美裸体xxxx极品少妇软件| 在线视频一区二区| 国产亚洲精品高潮| 国产一区欧美二区三区| 国产精品自产拍在线观| 中文字幕精品www乱入免费视频| 亚洲国产97在线精品一区| 精品国产网站地址| 日本亚洲欧洲色| 黑人巨大精品欧美一区免费视频| y97精品国产97久久久久久| 亚洲白拍色综合图区| 国产精欧美一区二区三区| 欧美有码在线观看| 精品国产拍在线观看| 国产精品女主播视频| 欧美日韩国产色视频|