首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

[你必須知道的.NET]第十八回:物件建立始末(上)

     編輯:關於.NET

本文介紹內容

  • 物件建立過程
  • 記憶體配置分析
  • 記憶體配置研究

1. 引言

了解 .NET 記憶體管理機制,首先從記憶體配置開始——即物件建立環節。物件建立是複雜過程,主要包含記憶體配置與初始化兩環節。例如:

FileStream fs = new FileStream(@"C:\temp.txt", FileMode.Create);

看似簡單的 new 操作,背後經歷相當複雜的過程。本文詳細討論此操作背後的過程,了解 .NET 記憶體配置如何實現。

2. 記憶體配置

配置在哪裡?

CLR 管理記憶體區域主要三塊:

  • 執行緒堆疊:配置值類型實例。由作業系統管理,不受 GC 控制。值類型實例所在方法結束時,儲存單元自動釋放。執行效率高,但容量有限。
  • GC 堆疊:配置小物件實例(< 85,000 位元組)。有記憶體配置或回收時,GC 可能壓縮 GC 堆疊。
  • LOH(大型物件堆疊):配置大物件實例(≥ 85,000 位元組)。LOH 不會被壓縮,僅在完全 GC 回收時回收。

本文以 GC 堆疊配置為例展開。值/參考型別論述請參見第八回。

導致物件建立的 IL 指令

  • newobj:建立參考型別物件
  • ldstr:建立 string 型別物件
  • newarr:配置新陣列物件
  • box:值類型轉參考型別時,欄位拷貝到受控堆疊發生的配置

2.1 執行緒堆疊的記憶體配置機制

值類型一般建立在執行緒堆疊。但非所有值類型皆在堆疊:作為類別欄位時,值類型作為實例成員一部分建立在受控堆疊;發生裝箱時,值類型欄位也會拷貝到受控堆疊。

對於堆疊上的區域變數,作業系統維護堆疊指標指向下一個自由空間位址,記憶體位址由高到低向下填充。以此例說明:

假設執行緒堆疊初始位址 50000,堆疊指標指向 50000。
int x = 100;  // 配置 4 Byte,指標移至 49996,值保存在 49997~50000
char c = 'A'; // 配置 2 Byte,指標移至 49994,值保存在 49995~49996

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

堆疊配置效率高,但容量不大,變數生命週期隨方法結束而消亡。

未完待續:受控堆疊的記憶體配置機制與必要補充說明,近期發布,敬請關注。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved