- RAM ROM
RAM:運行內(nèi)存,不能掉電存儲彤蔽。ROM:存儲性內(nèi)存,可以掉電存儲庙洼,例如內(nèi)存卡顿痪、Flash。
由于RAM類型不具備掉電存儲能力(即一掉電數(shù)據(jù)消失)油够,所以app程序一般存放于ROM中蚁袭。RAM的訪問速度要遠高于ROM,價格也要高石咬。 - App程序啟動
App程序啟動揩悄,系統(tǒng)會把開啟的那個App程序從Flash或ROM里面拷貝到內(nèi)存(RAM),然后從內(nèi)存里面執(zhí)行代碼鬼悠。
另一個原因是CPU不能直接從內(nèi)存卡里面讀取指令(需要Flash驅(qū)動等等)删性。 - 內(nèi)存分區(qū):
- 棧區(qū)(stack):
存放的局部變量亏娜、先進后出、一旦出了作用域就會被銷毀蹬挺;函數(shù)跳轉(zhuǎn)地址维贺,現(xiàn)場保護等; 程序猿不需要管理棧區(qū)變量的內(nèi)存(棧區(qū)地址從高到低分配)
- 棧區(qū)(stack):
堆區(qū)(heap):
堆區(qū)的內(nèi)存分配使用的是alloc巴帮;
需要程序猿管理內(nèi)存幸缕;ARC的內(nèi)存的管理,是編譯器再編譯的時候自動添加 retain晰韵、release发乔、autorelease;(堆區(qū)的地址是從低到高分配)全局區(qū)/靜態(tài)區(qū)(static):
包括兩個部分:未初始化過 雪猪、初始化過,也就是說栏尚,(全局區(qū)/靜態(tài)區(qū))在內(nèi)存中是放在一起的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域只恨, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域译仗;
eg:int a;未初始化的。int a = 10;已初始化的官觅。常量區(qū):常量字符串就是放在這里纵菌;
代碼區(qū): 存放App代碼;
如下圖所示:代碼區(qū)存放于低地址休涤,棧區(qū)存放于高地址咱圆。區(qū)與區(qū)之間并不是連續(xù)的。
4 . 注意事項
在iOS中功氨,堆區(qū)的內(nèi)存是應(yīng)用程序共享的序苏,堆中的內(nèi)存分配是系統(tǒng)負(fù)責(zé)的;
系統(tǒng)使用一個鏈表來維護所有已經(jīng)分配的內(nèi)存空間(系統(tǒng)僅僅紀(jì)錄捷凄,并不管理具體的內(nèi)容)忱详;
變量使用結(jié)束后,需要釋放內(nèi)存跺涤,OC中是根據(jù)引用計數(shù)==0匈睁,就說明沒有任何變量使用該空間,那么系統(tǒng)將直接收回桶错;
當(dāng)一個app啟動后航唆,代碼區(qū),常量區(qū)牛曹,全局區(qū)大小已固定佛点,因此指向這些區(qū)的指針不會產(chǎn)生崩潰性的錯誤醇滥。而堆區(qū)和棧區(qū)是時時刻刻變化的(堆的創(chuàng)建銷毀黎比,棧的彈入彈出)超营,所以當(dāng)使用一個指針指向這兩個區(qū)里面的內(nèi)存時,一定要注意內(nèi)存是否已經(jīng)被釋放阅虫,否則會產(chǎn)生程序崩潰(也即是野指針報錯)演闭。
5 . 其它操作系統(tǒng)
iOS是基于UNIX、Android是基于Linux的颓帝,在Linux和unix系統(tǒng)中米碰,內(nèi)存管理的方式基本相同;
Android應(yīng)用程序的內(nèi)存分配也是如此购城。除此以外吕座,這些應(yīng)用層的程序使用的都是虛擬內(nèi)存,它們都是建立在操作系統(tǒng)之上的瘪板,只有開發(fā)底層驅(qū)動或板級支持包時才會接觸到物理內(nèi)存吴趴,
舉例:在嵌入式Linux中,實際的物理地址只有64M甚至更小侮攀,但是虛擬內(nèi)存卻可以高達4G;