04進(jìn)階之路-內(nèi)存管理

1. 內(nèi)存布局相關(guān)

學(xué)習(xí)鏈接
堆區(qū)(heap): 向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),由鏈表實(shí)現(xiàn),內(nèi)存不連續(xù),由程序員管理

棧區(qū)(stack):向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),由計(jì)算機(jī)管理

全局\靜態(tài)區(qū)(static):靜態(tài)變量和全局變量是存儲(chǔ)在一起的。初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后有系統(tǒng)釋放。

文字常量區(qū):存放字符常量

程序代碼區(qū):存放函數(shù)的二進(jìn)制代碼


image

2. 內(nèi)存管理方案

1.Tagged Pointer 學(xué)習(xí)鏈接
64位架構(gòu)下引入,只適用小對(duì)象(NSNnumber,NSDate)
思想是把對(duì)象的指針存貯真實(shí)的值,這樣對(duì)象就是一個(gè)普通的指針,不在堆區(qū)分內(nèi)內(nèi)存,就不用程序員管理

2.NONPOINTER_ISA 指針的引用計(jì)數(shù) 學(xué)習(xí)鏈接
64位架構(gòu)下引入。ISA指針分為地址指針和非地址指針,這里用的就是非地址類型的。就是把指針的部分位通過 bit Mask 就是標(biāo)記 和用剩余位數(shù)存儲(chǔ)引用計(jì)數(shù)

3.散列表引用計(jì)數(shù) 學(xué)習(xí)鏈接
采用分離鎖技術(shù)并發(fā)訪問,提高效率
采用自旋鎖技術(shù)提高效率
采用HashMap技術(shù)提高效率
數(shù)據(jù)結(jié)構(gòu)如下

image

3. 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

學(xué)習(xí)鏈接 學(xué)習(xí)鏈接
自旋鎖:忙等,使用輕量訪問
RefcountMap:HashMap 存儲(chǔ)按哈希函數(shù)計(jì)算的位置存,讀取的時(shí)候按哈希函數(shù)的位置讀,不要遍歷
size_t:前兩位為標(biāo)志位,標(biāo)志是否有weak指針和是否正在被銷毀
weak_table_t:也是hashMap

4. MRC和ARC

MRC:手動(dòng)管理內(nèi)存
ARC:自動(dòng)管路內(nèi)存,編譯器靜態(tài)語言分析和Runtime協(xié)作
不能手動(dòng)調(diào)用retain,release,retainCount,delloc。
引入了weak和strong

5. 引用計(jì)數(shù)管理

alloc: 經(jīng)過一系列的調(diào)用,會(huì)調(diào)用C函數(shù)calloc,此時(shí)引用計(jì)數(shù)并不為1
retain: 經(jīng)過兩次hash查找找到對(duì)應(yīng)的size_t結(jié)構(gòu)加4(size_t前兩位被標(biāo)記位占用)
release:經(jīng)過兩次hash查找找到對(duì)應(yīng)的size_t結(jié)構(gòu)減4(size_t前兩位被標(biāo)記位占用
retainCount:查找到值與一個(gè)1相加(解釋了alloc之后引用計(jì)數(shù)不為1 卻查到是1的原因)
dealloc:會(huì)先檢查對(duì)象的弱引用和關(guān)聯(lián)對(duì)象情況,先清理在釋放

image

6. 弱引用管理

當(dāng)一個(gè)對(duì)象被銷毀時(shí)調(diào)用dealloc,會(huì)檢查該對(duì)象是否有弱指針指向該對(duì)象,如果有就通過他的內(nèi)存地址的經(jīng)過兩次hash查找找的保存weak指著的數(shù)組,遍歷置為nil

7. 自動(dòng)釋放池

學(xué)習(xí)鏈接
由一個(gè)雙向鏈表組成的棧結(jié)構(gòu),采用哨兵機(jī)制

8. 循環(huán)引用

1 避免循環(huán)引用
ARC:weak和__unsafe_unretain
MRC: assign和block
2 手動(dòng)斷環(huán)
NSTimer的中間對(duì)象法則(利用weak變量自動(dòng)把指針置為nil的特性,在每次毀掉的時(shí)候檢查,nil就銷毀timer)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容