標籤:
首先Android理機制相當複雜。想要講清楚比較困難。其次對於絕大多數使用者來說。僅僅關心記憶體夠不夠用,至於記憶體怎樣管理的這樣的技術細節,不是使用者須要去考慮的,寫這樣一個專題有沒有意義?畢竟我們是用手機,不是來研究手機的。
最後的顧慮是這個專題會不會太技術化了。絕大部分使用者不會看或者說缺乏對應的背景。
可是有一種激勵促使著我去寫這樣一個專題,一直以來,MIUI團隊在與使用者互動的過程中也同一時候在向使用者學習。你們的一些建議或者點子總會給我們啟發,這個專題中我相信你們相同能給以啟發。儘管說記憶體管理是一個非常技術的話題,但我們仍能夠從使用者的角度去看這些問題,記憶體管理是怎樣影響我們使用手機,作為使用者,我們能做些什麼。我會儘力使這樣一個專題不那麼技術化。可是仍舊免不了會有一些技術術語以及實現相關的討論,假設有興趣。我們就一起看看吧。
我們首先從使用者發的一個文章開始:“傳說中的神器。讓你的ms時刻保持空餘記憶體”。在這個文章中提到了"alter minfree"選項,在這一篇中我們就講講這個是什麼。它是怎樣工作的。
(1)Android是一個多任務系統,也就是說能夠同一時候執行多個程式,這個大家應該非常熟悉。一般來說,啟動執行一個程式是有一定的時間開銷的。因此為了加快執行速度,當你退出一個程式時。Android並不會馬上殺掉它,這樣下次再執行該程式時,能夠非常快的啟動。隨著系統中保留的程式越來越多,記憶體肯定會出現不足,這個時候Android系統開始揮舞屠刀殺程式。
這裡就有一個非常明顯的問題,殺誰?
(2)Android系統中殺程式的這個劊子手被稱作"LowMemory Killer",它是在Linux核心中實現的。
這裡它實現了一個機制,由程式的重要性來決定殺誰。通俗來說。誰不幹活。先殺誰。Android將程式的重要性分成下面幾類。依照重要性依次減少的順序:
| 名稱 |
oom_adj |
解釋 |
| FOREGROUD_APP |
0 |
前景程式,能夠理解為你正在使用的程式 |
| VISIBLE_APP |
1 |
使用者可見的程式 |
| SECONDARY_SERVER |
2 |
後台服務,比方說QQ會在後台執行服務 |
| HOME_APP |
4 |
HOME,就是主介面 |
| HIDDEN_APP |
7 |
被隱藏的程式 |
| CONTENT_PROVIDER |
14 |
內容提供者。 |
EMPTY_APP
|
15
|
空程式,既不提供服務,也不提供內容 |
當中每一個程式都會有一個oom_adj值,這個值越小,程式越重要,被殺的可能性越低。
(3)除了上述程式重要性分類之外,Android系統還維護著另外一張表,這張表是一個相應關係,以N1為例:
| oom_adj |
記憶體警戒值( 以4K為單位)
|
| 0 |
1536 |
| 1 |
2048 |
| 2 |
4096 |
| 7 |
5120 |
| 14 |
5632 |
| 15 |
6144 |
這個表是定義了一個相應關係。每個警戒值相應了一個重要性值,當系統的可用記憶體低於某個警戒值時,就殺掉全部大於該警戒值相應的重要性值的程式。比方說,當可用記憶體小於6144 * 4K = 24MB時,開始殺全部的EMPTY_APP,當可用記憶體小於5632 * 4K = 22MB時,開始殺全部
的CONTENT_PROVIDER和EMPTY_APP。
(4) alter minfree改的是什麼呢。上面這張相應表是由兩個檔案組成的:
/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree。
alter minfreee就是改動/sys/module/lowmemorykiller/parameters/minfree這個檔案的,舉例來說,假設把最後一項改為32 * 1024,那麼當可用記憶體小於128MB這是。他開始殺死所有EMPTY_APP。
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
Android記憶體管理