探尋iOS內(nèi)存分配

所有進(jìn)程(執(zhí)行的程序)都必須占用一定數(shù)量的內(nèi)存,它或是用來存放從磁盤載入的程序代碼,或是存放取自用戶輸入的數(shù)據(jù)等等。不過進(jìn)程對(duì)這些內(nèi)存的管理方式因內(nèi)存用途不一而不盡相同,有些內(nèi)存是事先靜態(tài)分配和統(tǒng)一回收的畔柔,而有些卻是按需要?jiǎng)討B(tài)分配和回收的。

下圖是iOS系統(tǒng)為一個(gè)APP分配的內(nèi)存臣樱,如下:


內(nèi)存.png

內(nèi)存分類(RAM靶擦、ROM)

  • RAM:運(yùn)行內(nèi)存,不能掉電儲(chǔ)存;
  • ROM:儲(chǔ)存性內(nèi)存,可以掉電儲(chǔ)存,例如:內(nèi)存卡,flash擎淤;
  • RAM的訪問速度要遠(yuǎn)高于ROM,價(jià)格也要高奢啥;
  • CPU只能從RAM直接讀取指令;
  • app程序一般存放于ROM中嘴拢。啟動(dòng)app時(shí)桩盲,系統(tǒng)會(huì)把開啟的app程序從ROM中轉(zhuǎn)移到RAM中。

內(nèi)存分區(qū)

iOS中主要是棧區(qū)(stack)席吴、堆區(qū)(heap)赌结、全局區(qū)/靜態(tài)區(qū)(staic) ;

棧區(qū)

  • 存放局部變量,先進(jìn)后出,一旦出了作用域就會(huì)被銷毀,函數(shù)跳轉(zhuǎn)地址,現(xiàn)場(chǎng)保護(hù)等
  • 棧區(qū)的地址從高到低分配

堆區(qū)

  • 堆區(qū)的內(nèi)存分配使用的是alloc;
  • 堆區(qū)的地址是從低到高分配;
  • ARC原理是基于堆區(qū)孝冒,編譯器在編譯的時(shí)候給對(duì)象自動(dòng)添加retain,release,autorelease;
  • 在ios中,堆區(qū)的內(nèi)存是應(yīng)用程序共享的,堆中的內(nèi)存分配是系統(tǒng)負(fù)責(zé)的柬姚;

全局區(qū)

  • 包括2個(gè)部分:未初始化和初始化; 也是說,在內(nèi)存中是放在一起的,比如:int a;未初始化, int a = 10 初始化的 2者都在全局區(qū)/靜態(tài)區(qū);
    常量區(qū):常量字符串及時(shí)放在這里的庄涡;
    代碼區(qū):存放app代碼量承;

tips:

  • 堆區(qū)需要程序猿管理內(nèi)存,是由alloc分配的內(nèi)存穴店,一般速度比較慢撕捍,容易產(chǎn)生內(nèi)存碎片;
  • 棧區(qū)不需要程序猿管理內(nèi)存泣洞,由編譯器自動(dòng)分配并釋放忧风,速度快;
  • 當(dāng)一個(gè)app啟動(dòng)后,代碼區(qū),常量區(qū),全局區(qū)大小都是已經(jīng)固定的,因此指向這些區(qū)的指針不會(huì)產(chǎn)生崩潰性的錯(cuò)誤,而堆區(qū)和棧區(qū)是時(shí)時(shí)刻刻變化的(堆得創(chuàng)建和銷毀,棧的彈入和彈出),所以當(dāng)使用一個(gè)指針指向這個(gè)2區(qū)里面內(nèi)存的時(shí)候,一定要注意內(nèi)存是否已經(jīng)被釋放,否則會(huì)產(chǎn)生程序崩潰(即野指針報(bào)錯(cuò))

iOS的內(nèi)存管理

這里按照蘋果文檔所述,重點(diǎn)對(duì)堆內(nèi)存分配整理下球凰。
首先狮腿,iOS和其它系統(tǒng)一樣腿宰,內(nèi)存分頁(yè),每頁(yè)4K缘厢。多個(gè)頁(yè)構(gòu)成一個(gè)region統(tǒng)一管理吃度,負(fù)責(zé)管理的對(duì)象是VM object,其中包含了pager昧绣、size规肴、resident pages等諸多屬性捶闸。不管是Objective-C的[NSObject alloc]夜畴,還是C代碼的對(duì)內(nèi)存分配,最終重任都會(huì)落到malloc庫(kù)上删壮,釋放也是如此贪绘,最終都將使用malloc庫(kù)中的free()。
malloc庫(kù)中有很多malloc的同族函數(shù)可以動(dòng)態(tài)分配內(nèi)存央碟,會(huì)結(jié)合參數(shù)在free pages中進(jìn)行最適分配税灌。如果分配的內(nèi)存比較大,可以直接使用vm_allocate亿虽,得到一個(gè)VM對(duì)象(與Linux類似)菱涤,這個(gè)在實(shí)際使用前不分配物理內(nèi)存。malloc的內(nèi)部實(shí)現(xiàn)都是開源的洛勉,感興趣的可以去了解去看粘秆。
此外,對(duì)于malloc收毫,還有一個(gè)Zone的概念(貌似與Linux的概念不完全相同)攻走,可以簡(jiǎn)單理解為一組free page單元,可以統(tǒng)一管理操作此再。默認(rèn)情況昔搂,在第一次調(diào)用malloc時(shí),系統(tǒng)會(huì)生成一個(gè)default zone输拇,后續(xù)的默認(rèn)分配在此進(jìn)行摘符。比如,malloc_zone_xxx()函數(shù)都是對(duì)特定的zone進(jìn)行分配操作策吠,執(zhí)行zone->xxx()逛裤。

最后強(qiáng)調(diào)一下iOS特別需要注意的點(diǎn):
當(dāng)前的主流iPhone實(shí)際物理內(nèi)存都不超過1G,可以說不算大奴曙。不過和Android機(jī)比起來别凹,我不得不為蘋果的設(shè)計(jì)稱贊,1G空間利用得如此高效洽糟,性能不差炉菲,也控制了發(fā)熱堕战。

驗(yàn)證示例:

未完待續(xù)

iOS引用計(jì)數(shù)原理

- 引用計(jì)數(shù)機(jī)制只使用在堆中,那么所有不保存在堆中的數(shù)據(jù)的引用計(jì)數(shù)都為-1拍霜。
- 在OC中幾乎所有不可變對(duì)象(常量)都存在常量區(qū)嘱丢,內(nèi)存管理由系統(tǒng)來做,引用計(jì)數(shù)為-1。
- 對(duì)象引用計(jì)數(shù)降至0祠饺,那么對(duì)象所在的內(nèi)存也許會(huì)回收越驻。
- retain 遞增引用計(jì)數(shù)
- release 遞減引用計(jì)數(shù)
- autorelease 清理「自動(dòng)釋放池」時(shí),在遞減保留計(jì)數(shù)
> [參考](http://www.reibang.com/p/67970ff59ffc)

致謝:

感謝“三石的博客”的作品

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末道偷,一起剝皮案震驚了整個(gè)濱河市缀旁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勺鸦,老刑警劉巖并巍,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異换途,居然都是意外死亡懊渡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門军拟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃执,“玉大人,你說我怎么就攤上這事懈息∩龅担” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵漓拾,是天一觀的道長(zhǎng)阁最。 經(jīng)常有香客問我,道長(zhǎng)骇两,這世上最難降的妖魔是什么速种? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮低千,結(jié)果婚禮上配阵,老公的妹妹穿的比我還像新娘。我一直安慰自己示血,他們只是感情好棋傍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著难审,像睡著了一般瘫拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上告喊,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天麸拄,我揣著相機(jī)與錄音派昧,去河邊找鬼。 笑死拢切,一個(gè)胖子當(dāng)著我的面吹牛蒂萎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淮椰,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼五慈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了主穗?” 一聲冷哼從身側(cè)響起泻拦,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黔牵,沒想到半個(gè)月后聪轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爷肝,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾浦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灯抛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片金赦。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖对嚼,靈堂內(nèi)的尸體忽然破棺而出夹抗,到底是詐尸還是另有隱情,我是刑警寧澤纵竖,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布漠烧,位于F島的核電站,受9級(jí)特大地震影響靡砌,放射性物質(zhì)發(fā)生泄漏已脓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一通殃、第九天 我趴在偏房一處隱蔽的房頂上張望度液。 院中可真熱鬧拥峦,春花似錦烤蜕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霹购。三九已至,卻和暖如春朋腋,著一層夾襖步出監(jiān)牢的瞬間齐疙,已是汗流浹背兢仰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剂碴,地道東北人把将。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像忆矛,于是被迫代替她去往敵國(guó)和親察蹲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 下圖是iOS系統(tǒng)為一個(gè)APP分配的內(nèi)存催训,如下: 內(nèi)存分類(RAM洽议、ROM) RAM:運(yùn)行內(nèi)存,不能掉電儲(chǔ)存; RO...
    軟件iOS開發(fā)閱讀 380評(píng)論 0 1
  • C語言中內(nèi)存分配 在任何程序設(shè)計(jì)環(huán)境及語言中漫拭,內(nèi)存管理都十分重要亚兄。在目前的計(jì)算機(jī)系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,148評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • iOS開發(fā)中的內(nèi)存分配與分區(qū) 內(nèi)存 關(guān)于RAM&ROM RAM與ROM就是具體的存儲(chǔ)空間采驻,統(tǒng)稱為存儲(chǔ)器审胚。 RAM(...
    瘋狂小魚人閱讀 377評(píng)論 0 0
  • 人力資源之所以稱之為人力資源,是因?yàn)閮?yōu)秀人才是最重要的生產(chǎn)力礼旅。大家都明白這個(gè)道理膳叨,但很少有人想過,人才痘系,不僅是生產(chǎn)...
    豬嘟嘟的貓媽媽閱讀 414評(píng)論 0 0