iOS系統(tǒng)為一個APP分配的內(nèi)存
下圖是iOS系統(tǒng)為一個APP分配的內(nèi)存,如下:
RAM:運行內(nèi)存,不能掉電儲存;
ROM:儲存性內(nèi)存,可以掉電儲存,例如:內(nèi)存卡,flash;
RAM的訪問速度要遠高于ROM,價格也要高;
CPU只能從RAM直接讀取指令;
app程序一般存放于ROM中。啟動app時,系統(tǒng)會把開啟的app程序從ROM中轉(zhuǎn)移到RAM中。
內(nèi)存分區(qū)
iOS中主要是棧區(qū)(stack)、堆區(qū)(heap)、全局區(qū)/靜態(tài)區(qū)(staic) ;
棧區(qū)
存放局部變量,先進后出,一旦出了作用域就會被銷毀,函數(shù)跳轉(zhuǎn)地址,現(xiàn)場保護等
棧區(qū)的地址從高到低分配
堆區(qū)
堆區(qū)的內(nèi)存分配使用的是alloc;
堆區(qū)的地址是從低到高分配;
ARC原理是基于堆區(qū),編譯器在編譯的時候給對象自動添加retain,release,autorelease;
在ios中,堆區(qū)的內(nèi)存是應用程序共享的,堆中的內(nèi)存分配是系統(tǒng)負責的;
全局區(qū)
包括2個部分:未初始化和初始化; 也是說,在內(nèi)存中是放在一起的,比如:int a;未初始化, int a = 10 初始化的 2者都在全局區(qū)/靜態(tài)區(qū);
常量區(qū):常量字符串及時放在這里的;
代碼區(qū):存放app代碼;
tips:
堆區(qū)需要程序猿管理內(nèi)存,是由alloc分配的內(nèi)存,一般速度比較慢,容易產(chǎn)生內(nèi)存碎片;
棧區(qū)不需要程序猿管理內(nèi)存,由編譯器自動分配并釋放,速度快;
當一個app啟動后,代碼區(qū),常量區(qū),全局區(qū)大小都是已經(jīng)固定的,因此指向這些區(qū)的指針不會產(chǎn)生崩潰性的錯誤,而堆區(qū)和棧區(qū)是時時刻刻變化的(堆得創(chuàng)建和銷毀,棧的彈入和彈出),所以當使用一個指針指向這個2區(qū)里面內(nèi)存的時候,一定要注意內(nèi)存是否已經(jīng)被釋放,否則會產(chǎn)生程序崩潰(即野指針報錯)
iOS的內(nèi)存管理
這里按照蘋果文檔所述,重點對堆內(nèi)存分配整理下。
首先,iOS和其它系統(tǒng)一樣,內(nèi)存分頁,每頁4K。多個頁構(gòu)成一個region統(tǒng)一管理,負責管理的對象是VM object,其中包含了pager、size、resident pages等諸多屬性。不管是Objective-C的[NSObject alloc],還是C代碼的對內(nèi)存分配,最終重任都會落到malloc庫上,釋放也是如此,最終都將使用malloc庫中的free()。
malloc庫中有很多malloc的同族函數(shù)可以動態(tài)分配內(nèi)存,會結(jié)合參數(shù)在free pages中進行最適分配。如果分配的內(nèi)存比較大,可以直接使用vm_allocate,得到一個VM對象(與Linux類似),這個在實際使用前不分配物理內(nèi)存。malloc的內(nèi)部實現(xiàn)都是開源的,感興趣的可以去了解去看。
此外,對于malloc,還有一個Zone的概念(貌似與Linux的概念不完全相同),可以簡單理解為一組free page單元,可以統(tǒng)一管理操作。默認情況,在第一次調(diào)用malloc時,系統(tǒng)會生成一個default zone,后續(xù)的默認分配在此進行。比如,malloc_zone_xxx()函數(shù)都是對特定的zone進行分配操作,執(zhí)行zone-》xxx()。
最后強調(diào)一下iOS特別需要注意的點:
當前的主流iPhone實際物理內(nèi)存都不超過1G,可以說不算大。不過和Android機比起來,我不得不為蘋果的設計稱贊,1G空間利用得如此高效,性能不差,也控制了發(fā)熱。
iOS引用計數(shù)原理
- 引用計數(shù)機制只使用在堆中,那么所有不保存在堆中的數(shù)據(jù)的引用計數(shù)都為-1。
- 在OC中幾乎所有不可變對象(常量)都存在常量區(qū),內(nèi)存管理由系統(tǒng)來做,引用計數(shù)為-1。
- 對象引用計數(shù)降至0,那么對象所在的內(nèi)存也許會回收。
- retain 遞增引用計數(shù)
- release 遞減引用計數(shù)
- autorelease 清理「自動釋放池」時,在遞減保留計數(shù)
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
iOS系統(tǒng)為一個APP分配的內(nèi)存下載
相關電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復哪些問題? 376
- 華為全新鴻蒙蓄勢待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應用 719
- 蘋果手機系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標明年智能手機出貨7000萬部;消息稱 MiOS 僅限國內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機身過熱 216
- Testin云測兼容和真機服務平臺中上線iPhone 15系列手機 208
- 利爾達推出搭載HooRiiOS的Matter模組 145
- 運放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448