Android 內(nèi)存管理原理

在Android開發(fā)中我們常常遇到app在后臺(tái)長期不使用時(shí)被系統(tǒng)自動(dòng)回收掉,Android系統(tǒng)是怎么實(shí)現(xiàn)這個(gè)功能的呢。我們不討論如何讓app保活的方法挺邀,主要來說說系統(tǒng)實(shí)現(xiàn)這一機(jī)制的原理

1、描述進(jìn)程的重要程度——oom_adj

在Android系統(tǒng)中使用oom_adj值來描述一個(gè)進(jìn)程的重要程度跳座,它是AMS的Process類型中的一個(gè)變量端铛,oom_adj值越小,表示進(jìn)程越重要疲眷,越不容易被殺掉禾蚕。以下是AMS中定義的一些oom_adj值

    static final int EMPTY_APP_ADJ;

    static final int HIDDEN_APP_MAX_ADJ;

    static final int HIDDEN_APP_MIN_ADJ;

    static final int HOME_APP_ADJ;

    static final int BACKUP_APP_ADJ;

    static final int SECONDARY_SERVER_ADJ;

    static final int HEAVY_WEIGHT_APP_ADJ;

    static final int PERCEPTIBLE_APP_ADJ;

    static final int VISIBLE_APP_ADJ;

    static final int FOREGROUND_APP_ADJ;

    static final int CORE_SERVER_ADJ = -12;

    static final int SYSTEM_ADJ = -16; 

可以看到一些運(yùn)行核心服務(wù)的進(jìn)程的oom_adj為-12(CORE_SERVER_ADJ),這類進(jìn)程基本不會(huì)被殺死狂丝。其他未賦值的都在static塊中進(jìn)行了初始化换淆,是通過system/rootdir/init.rc進(jìn)行配置的:

# Define the oom_adj values for the classes of processes that can be

# killed by the kernel.  These are used in ActivityManagerService.

   setprop ro.FOREGROUND_APP_ADJ 0

   setprop ro.VISIBLE_APP_ADJ 1

   setprop ro.SECONDARY_SERVER_ADJ 2

   setprop ro.HIDDEN_APP_MIN_ADJ 7

   setprop ro.CONTENT_PROVIDER_ADJ 14

   setprop ro.EMPTY_APP_ADJ 15

 

# Define the memory thresholds at which the above process classes will

# be killed.  These numbers are in pages (4k).

   setprop ro.FOREGROUND_APP_MEM 1536

   setprop ro.VISIBLE_APP_MEM 2048

   setprop ro.SECONDARY_SERVER_MEM 4096

   setprop ro.HIDDEN_APP_MEM 5120

   setprop ro.CONTENT_PROVIDER_MEM 5632

   setprop ro.EMPTY_APP_MEM 6144

可以看到前臺(tái)進(jìn)程的oom_adj值為0,這類進(jìn)程時(shí)我們正在交互的進(jìn)程几颜,基本也不會(huì)被殺掉倍试;空進(jìn)程對(duì)應(yīng)的值是15,當(dāng)系統(tǒng)內(nèi)存不足是最新殺掉的就是這類進(jìn)程(這類進(jìn)程一般指的是所有的activity都destory掉了蛋哭,并且沒有service在運(yùn)行)县习。adj值下面描述的是各種內(nèi)存閥值。比如當(dāng)系統(tǒng)剩余內(nèi)存小于6144 * 4kb(ro.EMPTY_APP_MEM)是emty 進(jìn)程就會(huì)被回收掉谆趾。這些值對(duì)與每個(gè)手機(jī)廠商生產(chǎn)的手機(jī)都是不一樣的躁愿。以下是oom_adj值對(duì)應(yīng)的內(nèi)存閥值

0 1536 
1 2048 
2 4096 
7 5120 
14 5632 
15 6144

如上所說,當(dāng)系統(tǒng)內(nèi)存小于6144 * 4kb時(shí)empty進(jìn)程將會(huì)被回收掉沪蓬,而empty進(jìn)程的oom_adj值為15攘已。在Activity、service怜跑、contentProvider、Broadcast Android四大組件的狀態(tài)的變化都會(huì)導(dǎo)致AMS更新對(duì)應(yīng)進(jìn)程oom_adj值吠勘,所以前臺(tái)進(jìn)程比后臺(tái)進(jìn)程更不容易殺掉性芬,帶有service的后臺(tái)進(jìn)程比沒有service的進(jìn)程更不容易被殺掉

2、LMK

LMK的全稱是low memory killer剧防,它是內(nèi)核的一個(gè)模塊植锉。它里面保存了各個(gè)進(jìn)程的pid以及對(duì)應(yīng)的oom_adj,每次AMS調(diào)用updateOOmAdj函數(shù)更新進(jìn)程的oom_adj時(shí)都會(huì)通知LMK模塊峭拘。
LMK通過linux的shrinker模塊來監(jiān)聽系統(tǒng)的內(nèi)存變化俊庇,當(dāng)系統(tǒng)的剩余內(nèi)存達(dá)到某個(gè)閥值時(shí)就會(huì)殺掉oom_adj值大于這個(gè)閥值對(duì)應(yīng)的oom_adj的進(jìn)程狮暑。它會(huì)優(yōu)先殺掉內(nèi)存占用多的進(jìn)程,如果殺掉這些進(jìn)程內(nèi)存回到了正常值將不會(huì)繼續(xù)殺進(jìn)程辉饱。所以讓app不要占用大量的內(nèi)存也可以起到卑崮校活的作用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市彭沼,隨后出現(xiàn)的幾起案子缔逛,更是在濱河造成了極大的恐慌,老刑警劉巖姓惑,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐奴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡于毙,警方通過查閱死者的電腦和手機(jī)敦冬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯沮,“玉大人脖旱,你說我怎么就攤上這事±煤玻” “怎么了夯缺?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甘耿。 經(jīng)常有香客問我踊兜,道長,這世上最難降的妖魔是什么佳恬? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任捏境,我火速辦了婚禮,結(jié)果婚禮上毁葱,老公的妹妹穿的比我還像新娘垫言。我一直安慰自己,他們只是感情好倾剿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布筷频。 她就那樣靜靜地躺著,像睡著了一般前痘。 火紅的嫁衣襯著肌膚如雪凛捏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天芹缔,我揣著相機(jī)與錄音坯癣,去河邊找鬼。 笑死最欠,一個(gè)胖子當(dāng)著我的面吹牛示罗,可吹牛的內(nèi)容都是我干的惩猫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼蚜点,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼轧房!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禽额,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锯厢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脯倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體实辑,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年藻丢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剪撬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠反,死狀恐怖残黑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斋否,我是刑警寧澤梨水,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站茵臭,受9級(jí)特大地震影響疫诽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旦委,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一奇徒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缨硝,春花似錦摩钙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宜岛,卻和暖如春匀钧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谬返。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留日杈,地道東北人遣铝。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓佑刷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酿炸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘫絮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容