標籤:android style http color os ar 使用 for sp
首先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記憶體管理