了解 .NET 記憶體管理機制,首先從記憶體配置開始——即物件建立環節。物件建立是複雜過程,主要包含記憶體配置與初始化兩環節。例如:
FileStream fs = new FileStream(@"C:\temp.txt", FileMode.Create);
看似簡單的 new 操作,背後經歷相當複雜的過程。本文詳細討論此操作背後的過程,了解 .NET 記憶體配置如何實現。
CLR 管理記憶體區域主要三塊:
本文以 GC 堆疊配置為例展開。值/參考型別論述請參見第八回。
newobj:建立參考型別物件ldstr:建立 string 型別物件newarr:配置新陣列物件box:值類型轉參考型別時,欄位拷貝到受控堆疊發生的配置值類型一般建立在執行緒堆疊。但非所有值類型皆在堆疊:作為類別欄位時,值類型作為實例成員一部分建立在受控堆疊;發生裝箱時,值類型欄位也會拷貝到受控堆疊。
對於堆疊上的區域變數,作業系統維護堆疊指標指向下一個自由空間位址,記憶體位址由高到低向下填充。以此例說明:
假設執行緒堆疊初始位址 50000,堆疊指標指向 50000。
int x = 100; // 配置 4 Byte,指標移至 49996,值保存在 49997~50000
char c = 'A'; // 配置 2 Byte,指標移至 49994,值保存在 49995~49996


方法結束時,釋放順序與配置相反:先刪除 c(指標 +2),再刪除 x(指標 +4),程序結束。

堆疊配置效率高,但容量不大,變數生命週期隨方法結束而消亡。
未完待續:受控堆疊的記憶體配置機制與必要補充說明,近期發布,敬請關注。