起源
在Android系統中,應用程式退出但是程序仍存在於系統中以便應用程式再次啟動時能快速啟動。這會產生一個問題:隨著應用程式開啟的越來越多,可用的系統記憶體就會越來越少。為了解決這個問題,就需要一個東西來監視所有的程序,它可以通過判斷各個程序的狀態,記憶體佔用情況依據特定的演算法在記憶體即將不足前殺死指定程序,這就是low memory killer,簡稱lmk。
lmk主要決定在什麼場景下什麼型別的程序可能會被殺,影響的是程序存活時間。它基於Linux的oom killer(out of memory killer)實現的,Linux oom策略在系統記憶體分配不足時將得分最高的程序殺掉。lmk會定時掃描系統可用記憶體,當可用記憶體不足時便會根據不同的記憶體檔位殺掉不同優先順序的程序。
相關原始碼檔案frameworks/base/services/core/java/com/android/server/am/ProcessList.javaframeworks/base/core/java/android/app/ActivityManager.java
關鍵引數 adjINVALID_ADJ = -10000:未初始化的adj,程序剛啟動時被賦予該值UNKNOWN_ADJ = 1001:一般指將要會快取程序,無法獲取確定值CACHED_APP_MAX_ADJ = 906:不可見程序的adj最大值CACHED_APP_MIN_ADJ = 900:不可見程序的adj最小值SERVICE_B_AD = 800:B List中的Service(較老的、使用可能性更小)PREVIOUS_APP_ADJ:使用者上一個使用的APP程序(往往通過按返回鍵)HOME_APP_ADJ:當型別為ACTIVITY_TYPE_HOME的應用,比如桌面APPSERVICE_ADJ = 500:服務程序(Service process)HEAVY_WEIGHT_APP_ADJ:後臺的重量級程序,system/rootdir/init.rc檔案中設定。realStartActivityLocked()過程,當應用的privateFlags標識PRIVATE_FLAG_CANT_SAVE_STATE的程序BACKUP_APP_ADJ:備份程序(執行bindBackupAgent()過程的程序)PERCEPTIBLE_APP_ADJ = 200:可感知程序,比如後臺音樂播放VISIBLE_APP_ADJ = 100:可見程序(Visible process)FOREGROUND_APP_ADJ = 0:前臺程序(Foreground process)PERSISTENT_SERVICE_ADJ:關聯著系統或persistent程序。是由startIsolatedProcess()方式啟動的程序,或者是由system_server或者persistent程序所繫結(並且帶有BIND_ABOVE_CLIENT或者BIND_IMPORTANT)的服務程序PERSISTENT_PROC_ADJ = -800:系統persistent程序,是指在AndroidManifest.xml中申明android:persistent=”true”的系統(即帶有FLAG_SYSTEM標記)程序,persistent程序一般情況並不會被殺,即便被殺或者發生Crash系統會立即重新拉起該程序。SYSTEM_ADJ = -900:系統程序NATIVE_ADJ = -1000:是由init程序fork出來的native程序(不被系統管理)關鍵引數processStatePROCESS_STATE_NONEXISTENT = 18:不存在的程序PROCESS_STATE_CACHED_EMPTY = 17:程序處於cached狀態,且為空程序PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 16:程序處於cached狀態,且為另一個cached程序(內含Activity)的client程序PROCESS_STATE_CACHED_ACTIVITY:程序處於cached狀態,且內含ActivityPROCESS_STATE_LAST_ACTIVITY:後臺程序,且擁有上一次顯示的ActivityPROCESS_STATE_HOME:後臺程序,且擁有home ActivityPROCESS_STATE_RECEIVER:後臺程序,且正在執行receiverPROCESS_STATE_SERVICE:後臺程序,且正在執行servicePROCESS_STATE_HEAVY_WEIGHT:後臺程序,但無法執行restore,因此儘量避免kill該程序PROCESS_STATE_BACKUP:後臺程序,正在執行backup/restore操作PROCESS_STATE_IMPORTANT_BACKGROUND:對使用者很重要的程序,使用者不可感知其存在PROCESS_STATE_IMPORTANT_FOREGROUND:對使用者很重要的程序,使用者可感知其存在PROCESS_STATE_TOP_SLEEPING5與PROCESS_STATE_TOP一樣,但此時裝置正處於休眠狀態PROCESS_STATE_FOREGROUND_SERVICE:擁有一個前臺ServicePROCESS_STATE_BOUND_FOREGROUND_SERVICE:擁有一個前臺Service,且由系統繫結PROCESS_STATE_TOP:擁有當前使用者可見的top ActivityPROCESS_STATE_PERSISTENT_UI:persistent系統程序,並正在執行UI操作PROCESS_STATE_PERSISTENT = 0:persistent系統程序adj計算核心方法updateOomAdjLocked:更新adj,當目標程序為空,或者被殺則返回false;否則返回truecomputeOomAdjLocked:計算adj,返回計算後RawAdj值applyOomAdjLocked:應用adj,當需要殺掉目標程序則返回false;否則返回trueadj值越大,優先順序越低,adj<0的程序都是系統程序。
tips:updateOomAdjLocked會依次呼叫到computeOomAdjLocked和applyOomAdjLocked
待續~
最新評論