[WWDC2018] ——深入解析iOS內(nèi)存/iOS Memory Deep Dive(一)

隨著用戶的增長(zhǎng)贿肩,用戶使用時(shí)間的延長(zhǎng)座哩,APP的內(nèi)存問(wèn)題會(huì)變得越發(fā)嚴(yán)重苍凛。今年WWDC大會(huì)趣席,有個(gè)專門的session,深入解析iOS內(nèi)存醇蝴。

我是寫了iOS內(nèi)存分析上-圖片加載內(nèi)存分析后看到了這個(gè)session宣肚,發(fā)現(xiàn)大致的思路相同,都是從實(shí)用角度分析怎么減少內(nèi)存消耗悠栓、footprint測(cè)量霉涨、圖片內(nèi)存占用分析幾個(gè)角度。session中的講解更加詳盡一些闸迷,本文嘗試整理session內(nèi)容嵌纲,并會(huì)增加一些自己的理解。

一腥沽、Why reduce memory

1 為什么要減少內(nèi)存消耗逮走?

APP加載更快,系統(tǒng)更流暢今阳,APP的內(nèi)存駐留時(shí)間更長(zhǎng)师溅,其他APP的內(nèi)存駐留時(shí)間更長(zhǎng)……總之,一句話:

為了更好的用戶體驗(yàn)

2.減小哪一部分的內(nèi)存消耗盾舌?

不是所有的內(nèi)存都是同等的墓臭,我們?cè)趇OS開(kāi)發(fā)中,需要關(guān)注的內(nèi)存消耗是:

Memory Footprint

二妖谴、Memory Footprint

1.Memory Pages

系統(tǒng)是按頁(yè)分配內(nèi)存的窿锉,每個(gè)page通常是16KB,APP消耗的內(nèi)存就是:

Memory in use = Number of pages * Page size

iOS內(nèi)存可以分為clean memory和dirty memory膝舅。當(dāng)用戶(也就是程序員)申請(qǐng)分配內(nèi)存時(shí)嗡载,系統(tǒng)只會(huì)對(duì)這塊內(nèi)存進(jìn)行標(biāo)記,這時(shí)只會(huì)分配虛擬內(nèi)存仍稀,而不會(huì)分配物理內(nèi)存洼滚,此時(shí)內(nèi)存是clean memory。當(dāng)對(duì)這塊內(nèi)存進(jìn)行數(shù)據(jù)填充時(shí)技潘,才會(huì)分配物理內(nèi)存遥巴,內(nèi)存變?yōu)閐irty memory千康。

example code:

int *array = malloc(20000 * sizeof(int));
array[0] = 32;
array[19999] = 64;

首先分配了20k的int,需要6個(gè)page铲掐,分別對(duì)page0和page5寫入數(shù)據(jù)后拾弃,這兩個(gè)page變?yōu)榱薲irty memory,而page1~4這4個(gè)page仍然是clean memory摆霉。

2.內(nèi)存模型

提出了一個(gè)內(nèi)存分級(jí)模型

Dirty Memory
Compressed
Clean Memory

Clean Memory

就是可以從內(nèi)存中換頁(yè)出去的內(nèi)存(can be paged out of Memory)砸彬。可以是:Memory-mapped files(image.jpeg, blob.data, training.model), frameworks*(__DATA_CONST)

一些運(yùn)行時(shí)的用法斯入,如swizz,會(huì)將以上所說(shuō)的framework中的clean memory蛀蜜,變?yōu)閐irty memory
Dirty Memory

是APP寫入的內(nèi)存刻两。可以是:All heap allocations, decoded image buffers, frameworks

特別指出滴某,由于單例創(chuàng)建后會(huì)常駐內(nèi)存磅摹,全局initialize在load或者link后就會(huì)運(yùn)行,可以一定程度上減少dirty memory霎奢。


+ (void)load;                   // Objective-c
+ (void)initialize;             // Objective-c
__attribute__((constructor))    // Objective-c

initialize();                   // swift
Compressed Memory

iOS系統(tǒng)中沒(méi)有磁盤交換系統(tǒng)(disk swap system户誓,就是傳統(tǒng)的PC端的虛擬內(nèi)存),而是在iOS7開(kāi)始引入了內(nèi)存壓縮(Memory compressor)幕侠。

它會(huì)將未訪問(wèn)的頁(yè)(unaccessed pages)進(jìn)行壓縮帝美,從而獲得更多的內(nèi)存空間,并在訪問(wèn)頁(yè)時(shí)晤硕,進(jìn)行解壓縮悼潭。

3.內(nèi)存警告

內(nèi)存警告未必是由于前臺(tái)APP導(dǎo)致的。比如舞箍,當(dāng)設(shè)備在低內(nèi)存時(shí)舰褪,打過(guò)來(lái)一通電話,就可能會(huì)出發(fā)內(nèi)存警告疏橄。同時(shí)占拍,由于Compressed Memory的存在,內(nèi)存警告時(shí)的策略需要有多重情況的策略設(shè)計(jì)捎迫,避免為了釋放內(nèi)存而訪問(wèn)了compressed內(nèi)存晃酒,導(dǎo)致內(nèi)存使用更加惡劣,最終OOM立砸。

推薦使用NSCache掖疮,有系統(tǒng)內(nèi)存feature的優(yōu)化。

4.Memory Footprint

有了上面的儲(chǔ)備知識(shí)后颗祝,可以通過(guò)以下公式進(jìn)行內(nèi)存優(yōu)化

Memory Footprint = Dirty Memory + Compressed Memory

也就是通常的APP浊闪,不需要關(guān)注Clean Memory恼布,使用NSCache進(jìn)行緩存,也可以不過(guò)多關(guān)注Compressed Memory搁宾。重點(diǎn)關(guān)注Dirty Memory折汞。

5.Memory Footprint Limit

Memory Footprint 限制是根據(jù)設(shè)備變更的,不同的設(shè)備的上限不同盖腿。

APP 的Memory Footprint Limit上限比較高
Extention的Memory Footprint Limit上限比較低

以及Xcode 10可以捕獲內(nèi)存超限的事件 EXC_RESOURCE_EXCEPTION爽待。emmm,所以是做了llvm優(yōu)化翩腐,使得能夠進(jìn)行相關(guān)事件的捕獲鸟款?期待iOS12發(fā)布,Xcode10打包茂卦,之后就可以順理成章拋棄iOS8何什,迎接新特性,走向人生巔峰了等龙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末处渣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛛砰,更是在濱河造成了極大的恐慌罐栈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泥畅,死亡現(xiàn)場(chǎng)離奇詭異荠诬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)位仁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門浅妆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人障癌,你說(shuō)我怎么就攤上這事凌外。” “怎么了涛浙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵康辑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轿亮,道長(zhǎng)疮薇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任我注,我火速辦了婚禮按咒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘但骨。我一直安慰自己励七,他們只是感情好智袭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著掠抬,像睡著了一般吼野。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上两波,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天瞳步,我揣著相機(jī)與錄音,去河邊找鬼腰奋。 笑死单起,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劣坊。 我是一名探鬼主播馏臭,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讼稚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绕沈,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锐想,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后乍狐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赠摇,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年浅蚪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藕帜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜傲,死狀恐怖洽故,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盗誊,我是刑警寧澤时甚,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站哈踱,受9級(jí)特大地震影響荒适,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜开镣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一刀诬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邪财,春花似錦陕壹、人聲如沸质欲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)把敞。三九已至,卻和暖如春榨惠,著一層夾襖步出監(jiān)牢的瞬間奋早,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工赠橙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耽装,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓期揪,卻偏偏與公主長(zhǎng)得像掉奄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凤薛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • Session 416 由三位蘋果軟件工程師 Kyle Howarth, James Snee, Kris Mar...
  • 前言 這個(gè)topic主要介紹了如何分析iOS app的內(nèi)存占用和如何做內(nèi)存優(yōu)化姓建,包括以下幾部分, 什么是內(nèi)存占用 ...
    fruitymoon閱讀 2,704評(píng)論 0 5
  • 我們很聊得來(lái)缤苫,對(duì)你慢慢有了感覺(jué)速兔,就是不知道你是和所有人都這樣也很聊得來(lái),如果是這樣我也就其中一個(gè)很普通當(dāng)然活玲!今晚你...
    叁二伍肆閱讀 148評(píng)論 0 0
  • 01 一個(gè)執(zhí)著于尋找意義的人 是從什么時(shí)候開(kāi)始問(wèn)這個(gè)問(wèn)題的呢涣狗? 從開(kāi)始的渾渾噩噩很多年,到掙扎痛苦尋求解脫舒憾,再到開(kāi)...
    蘇顏sky閱讀 436評(píng)論 2 0
  • 祝你25歲生日快樂(lè)。沒(méi)有生日禮物只好偷偷的在這里祝你生日快樂(lè)了探遵。一直以來(lái)都特別的包容我唧瘾,我無(wú)理取鬧,一次次的故意傷...
    劉熙瑤閱讀 246評(píng)論 1 1