ios 對堆記憶體和棧的理解以及 Instruments記憶體現象解析

來源:互聯網
上載者:User
現在開發的應用都用上了ARC技術,可是發現記憶體還是很大,用了Instruments檢測記憶體情況,總感覺程式的記憶體會變回一開始的1M多的情況,發現不會出現這種情況。反而發現一個現象,當你不斷的迴圈跑你的程式,到一定時間後,會穩定在某個值左右,這是為什麼呢?我在想是不是要把所有的view controller 都釋放掉就會回到一開始的1.0多M的情況?
然後我就不斷的搜帖,看有沒有相關的知識,發現:作業系統iOS 中應用程式使用的電腦記憶體不是統一分配空間,運行代碼使用的空間在三個不同的記憶體地區,分成三個段:“text segment “,“stack segment ”,“heap segment ”。

Objective-C的對象在記憶體中是以堆的方式分配空間的,並且堆記憶體是由你釋放的,即release

棧由編譯器管理自動釋放的,在方法中(函數體)定義的變數通常是在棧內,因此如果你的變數要跨函數的話就需要將其定義為成員變數。

1.棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數等值。其操作方式類似於資料結構中的棧。

2.堆區(heap):一般由程式員分配釋放,若程式員不釋放,則可能會引起記憶體流失。注堆和資料結構中的堆棧不一樣,其類是與鏈表。

作業系統iOS 中應用程式使用的電腦記憶體不是統一分配空間,運行代碼使用的空間在三個不同的記憶體地區,分成三個段:“text segment “,“stack segment ”,“heap segment ”。

段“text segment ”是應用程式運行時應用程式代碼存在的記憶體段。每一個指令,每一個單個函數、過程、方法和執行代碼都存在這個記憶體段中直到應用程式退出。一般情況下,你不會真的不得不知道這個段的任何事情。

當應用開始以後,函數main() 被調用,一些空間分配在”stack” 中。這是為應用程式指派的另一個段的記憶體空間,這是為了函數變數儲存需要而分配的 記憶體。每一次在應用中調用一個函數,“stack ”的一部分會被分配在”stack” 中,稱之為”frame” 。新函數的本地變數分配在這裡。

正如名稱所示,“stack ”是後進先出(LIFO )結構。當函數調用其他的函數時,“stack frame ”會被建立;當其他函數退出後,這個“frame ”會自動被破壞。

“heap” 段也稱為”data” 段,提供一個儲存中介貫穿函數的執行過程,全域和靜態變數儲存在“heap”中,直到應用退出。

為了訪問你建立在heap 中的資料,你最少要求有一個儲存在stack 中的指標,因為你的CPU 通過stack 中的指標訪問heap 中的資料。

你可以認為stack 中的一個指標僅僅是一個整型變數,儲存了heap 中特定記憶體位址的資料。實際上,它有一點點複雜,但這是它的基本結構。

簡而言之,作業系統使用stack 段中的指標值訪問heap 段中的對象。如果stack 對象的指標沒有了,則heap 中的對象就不能訪問。這也是記憶體泄露的原因。

在iOS 作業系統的stack 段和heap 段中,你都可以建立資料對象。

stack 對象的優點主要有兩點,一是建立速度快,二是管理簡單,它有嚴格的生命週期。stack 對象的缺點是它不靈活。建立時間長度度是多大就一直是多 大,建立時是哪個函數建立的,它的owner 就一直是它。不像heap 對象那樣有多個owner ,其實多個owner 等同於引用計數。只有 heap 對象才是採用“引用計數”方法管理它。

stack 對象的建立

只要棧的剩餘空間大於stack 對象申請建立的空間,作業系統就會為程式提供這段記憶體空間,否則將報異常提示棧溢出。

heap 對象的建立

作業系統對於記憶體heap 段是採用鏈表進行管理的。作業系統有一個記錄空閑記憶體位址的鏈表,當收到程式的申請時,會遍曆鏈表,尋找第一個空間大於所申請的heap 節點,然後將該節點從空閑節點鏈表中刪除,並將該節點的空間分配給程式。

總結:簡單來說,那些穩定在一個範圍的記憶體就是每一個類,每一個函數所分配的記憶體,直到程式結束才被釋放。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.