2.按back鍵:略
3.啟動乙個新的activity:
1.當應用程式關閉以後,後台對應的程序並沒有真正的退出(處於休眠狀態,一般不占用系統cpu的資源),這是為了下次再啟動的時候能快速啟動。
2.當系統記憶體不夠時,ams會主動根據一定的優先規則退出優先順序較低的程序。
a:與linux核心的記憶體管理模組配合: 系統記憶體情況(是否足夠)主要是linux核心的記憶體管理所控制的,ams只是從中起到為應用程式情況分配乙個oom_adj值(-16到15,android中只用了0-15 ;值越高越容易被**),然後告訴linux核心中註冊的oom killer去做**處理(呼叫linux內部的程序管理方法)。 (如果不支援這種方式,則進行潛規則)
b:潛規則(後台程序):**優先順序為 包含 前台activity < 前台service 或 provider < 後台 activity < 空程序 (即前台activity是最不容易被**的);
c:當最近執行的activity數量超過定義的max_activites(20)時, 滿足 處於stop(),還沒有finish(); 並是不可見的; 不是persistent(常駐程序)的; 也是最優先被kill的。
主要流程為:
1.android中執行了乙個叫oom的程序,他會在linux記憶體管理中註冊(為oom killer:用來**應用程序)。
2.當llinux記憶體管理模組檢測到系統記憶體不夠的時候,他就會通知註冊了的oom程序,然後oom程序就可以根據所定義的各種規則進行記憶體釋放了。
-------------------------------------
記憶體**釋放的地點包含三個:
1.ams中:當系統記憶體低時,會根據上述潛規則進行釋放。 process.killprocess(...)
2.oom killer中:根據oom_adj值呼叫linux內部的程序管理方法釋放優先順序較低的程序。(oom_adj越高,優先順序越低)
3.應用本身:當ams認為目標程序需要被殺死時,首先會通知目標程序進行記憶體釋放,包括呼叫目標程序的 schedulelowmemory() 和 processinbackground() 方法(客戶程序記憶體**)
呼叫**:
執行順序為上述的 a b c,在這之前還會先刪除mremovedprocesses列表中記錄的程序 ,如下情況會被加入到列表中(
1.當某個程序crash後。
2.當某個程式ui執行緒5秒之內沒響應,彈出arn,如選擇強制關閉。
3.手動呼叫ams提供的killbackgroundprocess(),需要新增許可權。
4.當系統啟動時,在ams的systemready()方法中,啟動非persistent(常駐)程序,一般都是常駐的,基本不會發生)
4.computeoomadjlocked()估算指定程序的oom_adj值
客戶程序記憶體**:
迴圈**處理mprocessestogc列表中物件
(**方式主要分2種情況)
1.記憶體低時導致進行**。
b.**sqlite。呼叫sqlitedatabase,releasememory();
c.**canvas。呼叫canvas.freecaches()。其中乙個activity中可能包含多個canvas物件
d.釋放binder:採用 binderinternal.forcegc("引數"); 這裡的引數表明**的理由
2.釋放cpu進行**。
只釋放binder:採用 binderinternal.forcegc("引數"); 這裡的引數表明**的理由
linux核心記憶體管理
整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...
windows核心 記憶體管理
一 幾個基本的概念 1.儲存器的金字塔結構 儲存器從下之上依次是磁碟 flash dram 記憶體 l2 cache l1 cache 暫存器,越在上面的儲存器訪問速度越快,同時 也越昂貴,每一級都可以看做是下一級的快取,記憶體是磁碟的快取,cache是記憶體的快取。2.位址空間 3.頁將物理記憶體...
linux核心記憶體管理
1.每個程序都有自己的頁面目錄,都是虛擬位址,便於mmu將虛擬位址轉換為實體地址 2.task struct mm struct pgd 3.struct page用來表示乙個物理頁面,在核心中有乙個page的陣列,用來表示當前系統中所有的物理頁面 4.頁面目錄 頁面表 物理頁面起始位址1.物理頁面...