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

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

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

RAM:運(yùn)行內(nèi)存,不能掉電儲(chǔ)存;

ROM:儲(chǔ)存性內(nèi)存,可以掉電儲(chǔ)存,例如:內(nèi)存卡,flash轨功;

RAM的訪問(wèn)速度要遠(yuǎn)高于ROM,價(jià)格也要高鲁僚;

CPU只能從RAM直接讀取指令炊苫;

app程序一般存放于ROM中。啟動(dòng)app時(shí)冰沙,系統(tǒng)會(huì)把開(kāi)啟的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è)部分:未初始化和初始化; 也是說(shuō),在內(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)都是開(kāi)源的孙蒙,感興趣的可以去了解去看。

此外悲雳,對(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)存都不超過(guò)1G钙皮,可以說(shuō)不算大蜂科。不過(guò)和Android機(jī)比起來(lái),我不得不為蘋果的設(shè)計(jì)稱贊短条,1G空間利用得如此高效导匣,性能不差,也控制了發(fā)熱茸时。

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

- 引用計(jì)數(shù)機(jī)制只使用在堆中贡定,那么所有不保存在堆中的數(shù)據(jù)的引用計(jì)數(shù)都為-1。

- 在OC中幾乎所有不可變對(duì)象(常量)都存在常量區(qū)可都,內(nèi)存管理由系統(tǒng)來(lái)做,引用計(jì)數(shù)為-1缓待。

- 對(duì)象引用計(jì)數(shù)降至0,那么對(duì)象所在的內(nèi)存也許會(huì)回收渠牲。

- retain 遞增引用計(jì)數(shù)

- release 遞減引用計(jì)數(shù)

- autorelease 清理「自動(dòng)釋放池」時(shí)旋炒,在遞減保留計(jì)數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市签杈,隨后出現(xiàn)的幾起案子瘫镇,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铣除,死亡現(xiàn)場(chǎng)離奇詭異谚咬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)通孽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門序宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睁壁,“玉大人背苦,你說(shuō)我怎么就攤上這事∨嗣鳎” “怎么了行剂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钳降。 經(jīng)常有香客問(wèn)我厚宰,道長(zhǎng),這世上最難降的妖魔是什么遂填? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任铲觉,我火速辦了婚禮,結(jié)果婚禮上吓坚,老公的妹妹穿的比我還像新娘撵幽。我一直安慰自己,他們只是感情好礁击,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盐杂。 她就那樣靜靜地躺著,像睡著了一般哆窿。 火紅的嫁衣襯著肌膚如雪链烈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天挚躯,我揣著相機(jī)與錄音强衡,去河邊找鬼。 笑死码荔,一個(gè)胖子當(dāng)著我的面吹牛漩勤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播目胡,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锯七,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了誉己?” 一聲冷哼從身側(cè)響起眉尸,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后噪猾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霉祸,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年袱蜡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丝蹭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坪蚁,死狀恐怖奔穿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敏晤,我是刑警寧澤贱田,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嘴脾,受9級(jí)特大地震影響男摧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜译打,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一耗拓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奏司,春花似錦乔询、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至麻献,卻和暖如春们妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勉吻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工监婶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人齿桃。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓惑惶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親短纵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子带污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 下圖是iOS系統(tǒng)為一個(gè)APP分配的內(nèi)存,如下: 內(nèi)存分類(RAM香到、ROM) RAM:運(yùn)行內(nèi)存,不能掉電儲(chǔ)存鱼冀; RO...
    sweetpf閱讀 3,899評(píng)論 0 4
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制报破。與retain配對(duì)使用的方法是dealloc還是release,為什么千绪?需要與a...
    丶逐漸閱讀 1,964評(píng)論 1 16
  • JVM內(nèi)存模型Java虛擬機(jī)(Java Virtual Machine=JVM)的內(nèi)存空間分為五個(gè)部分充易,分別是: ...
    光劍書(shū)架上的書(shū)閱讀 2,509評(píng)論 2 26
  • 對(duì)一道面試題的思考看到如下的面試題,你想到了什么荸型?筆者做了一個(gè)很好的示范盹靴,從數(shù)據(jù)規(guī)模,傳輸瑞妇,存儲(chǔ)和檢索各個(gè)方面稿静。基...
    Jeff閱讀 152評(píng)論 0 0
  • 上班的上班踪宠,燒飯的燒飯自赔,輕食這個(gè)話題一邊紅透半邊天妈嘹,一邊卻是完全可以在生活里細(xì)水長(zhǎng)流的柳琢。Meal Plan前先交代...
    周米啊閱讀 408評(píng)論 0 1