天天看點

.NET 的記憶體管理機制(三)托管堆概念在記憶體配置設定分析之前,對幾個基本概念做以下交代,以便接下來的分析

托管堆概念

引用類型的執行個體配置設定于托管堆上,而線程棧卻是對象生命周期開始的地方。對 32 位處理器來說,應用程式完成程序初始化後,CLR 将在程序的可用位址空間上配置設定一塊保留的位址空間,它是程序(每個程序可使用 4GB)中可用位址空間上的一塊記憶體區域,但并不對應于任何實體記憶體,這塊位址空間即是托管堆。

托管堆又根據存儲資訊的不同劃分為多個區域,其中最重要的是垃圾回收堆(GC Heap)和加載堆(Loader Heap),GC Heap 用于存儲對象執行個體,受 GC 管理;

Loader Heap 又分為 High-Frequency Heap、Low-Frequency Heap 和 Stub Heap,不同的堆上又存儲不同的資訊。Loader Heap 最重要的資訊就是中繼資料相關的資訊,也就是 Type 對象,每個Type在 Loader Heap 上展現為一個 Method Table(方法表),而 Method Table 中則記錄了存儲的中繼資料資訊,例如基類型、靜态字段、實作的接口、所有的方法等等。Loader Heap不受GC控制,其生命周期為從建立到AppDomain 解除安裝。

在記憶體配置設定分析之前,對幾個基本概念做以下交代,以便接下來的分析

TypeHandle,類型句柄,指向對應執行個體的方法表,每個對象建立時都包含該附加成員,并且占用 4 個位元組的記憶體空間。我們知道,每個類型都對應于一個方法表,方法表建立于編譯時,主要包含了類型的特征資訊、實作的接口數目、方法表的 slot 數目等。
SyncBlockIndex,用于線程同步,每個對象建立時也包含該附加成員,它指向一塊被稱為Synchronization Block 的記憶體塊,用于管理對象同步,同樣占用 4 個位元組的記憶體空間。
NextObjPtr,由托管堆維護的一個指針,用于辨別下一個建立對象配置設定時在托管堆中所處的位置。CLR 初始化時,NextObjPtr 位于托管堆的基位址。

是以,我們對引用類型配置設定過程應該有個基本的了解,下篇實作一個相對簡單的類型來做說明。