1? RAM ROM
RAM:運(yùn)行內(nèi)存媳友,不能掉電存儲(chǔ)风科。ROM:存儲(chǔ)性?xún)?nèi)存撒轮,可以掉電存儲(chǔ)乞旦,例如內(nèi)存卡、Flash题山。
?????由于RAM類(lèi)型不具備掉電存儲(chǔ)能力(即一掉電數(shù)據(jù)消失)兰粉,所以app程序一般存放于ROM中。RAM的訪問(wèn)速度要遠(yuǎn)高于ROM顶瞳,價(jià)格也要高玖姑。
2 ?App程序啟動(dòng)
? ??App程序啟動(dòng)裹驰,系統(tǒng)會(huì)把開(kāi)啟的那個(gè)App程序從Flash或ROM里面拷貝到內(nèi)存(RAM)疮鲫,然后從內(nèi)存里面執(zhí)行代碼。
? ? 另一個(gè)原因是CPU不能直接從內(nèi)存卡里面讀取指令(需要Flash驅(qū)動(dòng)等等)嗦哆。
3??內(nèi)存分區(qū):
?????棧區(qū)(stack):存放的局部變量符喝、先進(jìn)后出闪彼、一旦出了作用域就會(huì)被銷(xiāo)毀;函數(shù)跳轉(zhuǎn)地址协饲,現(xiàn)場(chǎng)保護(hù)等畏腕;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 程序猿不需要管理?xiàng)^(qū)變量的內(nèi)存;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (棧區(qū)地址從高到低分配)囱稽;?????
?????堆區(qū)(heap):堆區(qū)的內(nèi)存分配使用的是alloc郊尝;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 需要程序猿管理內(nèi)存二跋;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ARC的內(nèi)存的管理战惊,是編譯器再便宜的時(shí)候自動(dòng)添加 retain、release扎即、autorelease吞获;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (堆區(qū)的地址是從低到高分配)
?????全局區(qū)/靜態(tài)區(qū)(static):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 包括兩個(gè)部分:未初始化過(guò) 、初始化過(guò)谚鄙;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 也就是說(shuō)各拷,(全局區(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 ?注意事項(xiàng)
?? 在iOS中诽表,堆區(qū)的內(nèi)存是應(yīng)用程序共享的唉锌,堆中的內(nèi)存分配是系統(tǒng)負(fù)責(zé)的隅肥;
? ?系統(tǒng)使用一個(gè)鏈表來(lái)維護(hù)所有已經(jīng)分配的內(nèi)存空間(系統(tǒng)僅僅紀(jì)錄,并不管理具體的內(nèi)容)袄简;
? ?變量使用結(jié)束后腥放,需要釋放內(nèi)存,OC中是根據(jù)引用計(jì)數(shù)==0痘番,就說(shuō)明沒(méi)有任何變量使用該空間捉片,那么系統(tǒng)將直接收回;
?當(dāng)一個(gè)app啟動(dòng)后汞舱,代碼區(qū)伍纫,常量區(qū),全局區(qū)大小已固定昂芜,因此指向這些區(qū)的指針不會(huì)產(chǎn)生崩潰性的錯(cuò)誤莹规。而堆區(qū)和棧區(qū)是時(shí)時(shí)刻刻變化的(堆的創(chuàng)建銷(xiāo)毀,棧的彈入彈出)泌神,所以當(dāng)使用一個(gè)指針指向這兩個(gè)區(qū)里面的內(nèi)存時(shí)良漱,一定要注意內(nèi)存是否已經(jīng)被釋放,否則會(huì)產(chǎn)生程序崩潰(也即是野指針報(bào)錯(cuò))欢际。
5母市、其它操作系統(tǒng)
iOS是基于UNIX、Android是基于Linux的损趋,在Linux和unix系統(tǒng)中患久,內(nèi)存管理的方式基本相同;
? ? ? Android應(yīng)用程序的內(nèi)存分配也是如此浑槽。除此以外蒋失,這些應(yīng)用層的程序使用的都是虛擬內(nèi)存,它們都是建立在操作系統(tǒng)之上的桐玻,只有開(kāi)發(fā)底層驅(qū)動(dòng)或板級(jí)支持包時(shí)才會(huì)接觸到物理內(nèi)存篙挽,
? ? ? 舉例:在嵌入式Linux中,實(shí)際的物理地址只有64M甚至更小镊靴,但是虛擬內(nèi)存卻可以高達(dá)4G;
轉(zhuǎn)載自:http://blog.csdn.net/yang198907/article/details/50212925