https://xiaozhuanlan.com/topic/6973420158
[https://developer.apple.com/documentation/xcode/improving_your_app_s_performance/reducing_your_app_s_memory_use]
內(nèi)存
虛擬內(nèi)存
虛擬內(nèi)存技術(shù)可以使一個(gè)應(yīng)用程序認(rèn)為自己有一段連續(xù)的內(nèi)存空間(多個(gè)大小相同的內(nèi)存頁(yè)page組成的邏輯地址空間)宾添,使得程序編程和運(yùn)行起來(lái)容易继谚;同事隱藏了真實(shí)的物理內(nèi)存地址,起到一定的保護(hù)作用;還能隔離不同的進(jìn)程琼讽,更安全
當(dāng)前虛擬內(nèi)存和物理內(nèi)存的分頁(yè)都是16kb
iOS虛擬內(nèi)存
內(nèi)存空間結(jié)構(gòu)
因?yàn)閕Phone中的磁盤(pán)用的是閃存(容量和讀寫(xiě)壽命都有限制),所以iOS中沒(méi)有memory swap機(jī)制巍糯,memery swap也就是當(dāng)內(nèi)存空間不足時(shí)將部分內(nèi)存數(shù)據(jù)存儲(chǔ)到磁盤(pán)中齿穗,等到下次使用時(shí)再?gòu)拇疟P(pán)中,等到下次使用時(shí)喊括,再?gòu)拇疟P(pán)讀取數(shù)據(jù)到內(nèi)存中胧瓜。
取而代之的是,iOS采用的是內(nèi)存警告memory warning郑什,當(dāng)系統(tǒng)檢測(cè)到內(nèi)存空間不足時(shí)府喳,會(huì)給每個(gè)進(jìn)程APP發(fā)送memory warning。
Clean momery 和Dirty memory
Memory Page 分為 Clean Memory 和 Dirty Memory蘑拯,前者通常來(lái)說(shuō)是指能夠進(jìn)行memory swap的memory page钝满,而后者不能夠進(jìn)行內(nèi)存置換操作兜粘,但是iOS因?yàn)闆](méi)有memory swap,所以Clean Memory不是通常的意思弯蚜,在iOS中是指能夠重復(fù)被使用的內(nèi)存頁(yè)孔轴,相對(duì)的,Dirty Memory 是不能夠重復(fù)使用的內(nèi)存頁(yè)
Clean Memory 主要包括以下幾部分:
- app的二進(jìn)制可執(zhí)行文件
- framework中的_DATA_CONST 段
- 文件映射的內(nèi)存
- 未寫(xiě)入數(shù)據(jù)的內(nèi)存
下面就“未寫(xiě)入數(shù)據(jù)的內(nèi)存”舉個(gè)例子:
int *array = malloc(20000 * sizeof(int));
array[0] = 32
array[19999] = 64
那內(nèi)存頁(yè)分類如下:
紅色的頁(yè)是 Dirty Memory碎捺,藍(lán)色的頁(yè)是Clean Memory
MRC就是手動(dòng)加retain release autorelease路鹰,ARC就是編輯器幫你加retain release autorelease,下面測(cè)試下MRC: