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

.NET 托管物件記憶體模型深度解析:實例建立位置、堆結構與引用追蹤

     編輯:關於.NET

一、實值型別實例建立位置

CLR 依情境以兩種方式配置實值型別實例:

  1. 區域變數:方法區域變數 → 執行緒堆疊。
  2. 類別欄位:作為參考型別實例的成員 → 隨宿主物件在 GC 堆 上配置。
public class Test1 {
    private int i; // (2) 欄位:隨 Test1 實例在 GC Heap 配置
    public Test1() {
        byte b = 0; // (1) 區域變數:在執行緒堆疊配置
    }
}

二、參考型別實例建立位置

依物件大小分流:

  1. 小物件 (< 85,000 bytes) → GC Heap(GC 會壓縮整理)。
  2. 大物件 (≥ 85,000 bytes) → LOH (Large Object Heap)(不壓縮,僅標記清除)。
public class Test2 {
    private int[] intArr;
    public Test2() {
        object o = new Object();           // 參考 o 在堆疊,實例在 GC Heap
        intArr = new int[21250];           // 21250 * 4 bytes = 85,000 bytes → LOH
    }
}

三、托管物件被引用的七種途徑

  1. GC Heap 物件欄位持有(如 Test2.intArr)
  2. 執行緒堆疊區域變數持有(如 object o)
  3. LOH 物件欄位持有
  4. Handle Table:P/Invoke、COM 互操作、釘選
  5. 暫存器:this 指標、fastcall 傳遞參數(ECX/EDX)
  6. Finalizer Queue:擁有完成項的物件
  7. 型別 HandleTable:弱引用,物件建立時自動登記

示意圖:

托管物件引用途徑示意圖

四、托管物件記憶體結構

物件參考指向 Object Header (4 bytes) 之後:

  • SyncBlock Index:指向 SyncTableEntry,含鎖、雜湊碼、AppDomain 索引等。未使用時為 0;lock(obj) 或 GetHashCode() 觸發配置。
  • TypeHandle (4 bytes):指向 MethodTable(類似 C++ vtable 但更複雜)。
  • 實例欄位:依 StructLayoutAttribute(LayoutKind.Auto) 自動排序以節省空間,順序不一定與宣告順序相同。

同步區塊生命週期範例

Object obj = new Object(); // syncblk = 0
lock(obj) { /* ... */ }    // CLR 建立 SyncBlock,更新 Object Header
obj.GetHashCode();         // 同步區塊記錄雜湊碼

來源

原文出處:https://happyhippy.cnblogs.com/

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