天天看點

iOS - 記憶體管理 01

iOS - 記憶體管理 01

一、概述

内部管理簡單來說就是計算機内部存儲的管理,我們從馮·諾依曼結構說起,馮·諾依曼結構指出了計算機由運算器、控制器、存儲器、輸入和輸出裝置幾大部件組成。拿 iPhone 8 舉例來說,運算器和控制器合在一起就是 CPU(中央處理器),運作記憶體為 3GB LPDDR4 RAM。而 64G 256G 為存儲ROM。

馮·諾依曼結構還指出記憶體是用是cun對于我們開發者來說,指令基本就是代碼邏輯,資料基本就是變量

、常量之類了

二、通用記憶體基本原理

最簡單來說分為兩大部分:指令+資料。再細分一點,五部分:代碼(指令),初始化資料區,未初始化資料區,堆,棧。

  • 代碼(指令,text)就不用說了,最靜态的,就是隻讀的東西;
  • 初始化資料,簡單了解就是有初始值的變量、常量;
  • 未初始化資料,隻聲明未給值的變量,運作前統統為0,之是以單獨分出來,估計是性能考慮,因為這些東西都是0,沒必要放在程式包裡,也不用copy;
  • 棧,程式運作記錄,每個線程,也就是每個執行序列各有一個(看crash log最容易了解),都是編譯的時候能确定好的,還有一個特點就是這裡面的資料可以不用指針,也不會丢;
  • 堆,最靈活的記憶體區,用途多多,動态配置設定和釋放,編譯時不能提前确定,我們的 bjective-C 象都是這麼來的,都存在這裡,通常堆中的對象都是以指針來通路的,指針從線程棧中來,但不獨屬于某個線程,堆也是對複雜的運作時處理的基礎支援,還有就是ARC還是MRC、“誰配置設定誰釋放”說的都是堆上對象的管理;

三、iOS 的記憶體管理

其實,iOS的記憶體管理和其它作業系統大同小異。這裡按照蘋果文檔所述,重點對堆記憶體配置設定整理下。

iOS的記憶體管理分為幾個層面,從系統到libmalloc,ARC環境下,編譯器也會幫助開發者做“力所能及”的優化處理。

首先,iOS和其它系統一樣,作業系統核心會做虛拟存儲到實體記憶體的映射管理,并做記憶體分頁,每頁4K。多個頁構成一個記憶體區塊統一管理,負責管理的對象是VM object,其中包含了pager、size、resident pages等諸多屬性。所有的記憶體配置設定最終都将交由系統來處理(比如vm_allocate/mach_vm_allocate)。

而開發中,在系統核心的基礎上,iOS使用libmalloc。不管是Objective-C的[NSObject alloc],還是C代碼的對記憶體配置設定,重任都會落到malloc庫上,釋放也是如此,最終都将使用malloc庫中的free()。malloc庫中有很多malloc的同族函數可以動态配置設定記憶體。malloc庫中定義了zone的概念,并實作了不同的zone(如nano zone和scalable zone),并根據記憶體需求的大小使用不通算法對nano、tiny、small、large量級的記憶體進行配置設定和釋放管理。預設情況,在第一次調用malloc時,系統會生成一個default zone,後續的預設配置設定在此進行。比如,malloc_zone_xxx()函數最終都對特定的zone進行配置設定操作,執行zone->xxx()。每個zone都以連結清單的形式對已配置設定過的記憶體做cache處理,避免頻繁對核心系統發起申請。malloc的内部實作都是開源的,感興趣的可以去了解去看。

當記憶體吃緊時,對于可以重新載入的隻讀資料來說,直接清理掉,而對于可寫的資料,隻能通過App自己去管理維護。記憶體緊張時,iOS會向App發起memory warning,不配合釋放足夠記憶體者,殺!

相關文章

![iOS并發開發簡要整理(上)]http://www.molotang.com/articles/2001.html

繼續閱讀