System.Object 作為 .NET 類型系統的根基,其記憶體佈局與運行時表現決定了所有托管物件的共同特徵。本文從實例記憶體模型、物件頭、同步塊、方法表三大核心結構切入,深度還原 Object 的真實面目。
網上流傳:「物件結構 = SyncBlockIndex + MethodTable 指標 + Instance Data(連續分佈)」。這是將邏輯視圖誤認為物理佈局。實際上:
m_SyncBlockValue 的位級結構m_SyncBlockValue 為 32 位元無號整數 (DWORD),高 6 位為旗標,低 26 位為索引/雜湊碼/鎖資訊。
class ObjHeader {
private:
DWORD m_SyncBlockValue; // 必須是最後一個欄位
public:
DWORD GetHeaderSyncBlockIndex() { ... }
void SetIndex(DWORD indx) { ... } // 使用 Interlocked CAS 保證執行緒安全
Object* GetBaseObject() { return (Object*)(this + 1); } // 實例起始位址
// ... 位操作輔助方法
};
SyncBlock.h 節選)| 旗標常數 | 位位置 | 含義 |
|---|---|---|
BIT_SBLK_STRING_HAS_NO_HIGH_CHARS | 31 | 字串無高位元字元 |
BIT_SBLK_AGILE_IN_PROGRESS | 31 | 敏捷檢查進行中(防循環引用) |
BIT_SBLK_STRING_HIGH_CHARS_KNOWN | 30 | 字串高位元字元狀態已知 |
BIT_SBLK_FINALIZER_RUN | 30 | 終結器已執行(複用字串位) |
BIT_SBLK_GC_RESERVE | 29 | GC 保留位 |
BIT_SBLK_SPIN_LOCK | 28 | 自旋鎖位(輕量鎖) |
BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX | 27 | 1=低26位為索引/雜湊,0=薄鎖結構 |
BIT_SBLK_IS_HASHCODE | 26 | 1=低26位為雜湊碼,0=SyncBlock 索引 |
BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX == 0):
BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX == 1):
BIT_SBLK_IS_HASHCODE == 1:低 26 位 = 雜湊碼BIT_SBLK_IS_HASHCODE == 0:低 26 位 = SyncBlock 索引BIT_SBLK_SPIN_LOCK),自旋 ~1000 週期。CriticalSection),分配 SyncBlock 表項,索引寫入 Header。// .NET 2.0+ 類別形式
class SyncTableEntry {
public:
PTR_SyncBlock m_SyncBlock; // 指向實際 SyncBlock
Object* m_Object; // 弱引用回物件
static SyncTableEntry*& GetSyncTableEntry() { return g_pSyncTable; }
};
// 全域陣列
class SyncBlockArray {
public:
SyncBlockArray* m_Next;
BYTE m_Blocks[MAXSYNCBLOCK * sizeof(SyncBlock)];
};
g_pSyncTable 為 SyncBlockArray*,動態擴展鏈表。GetHashCode() 實現依賴 SyncTableEntry 中的雜湊碼欄位。| 資料類型 | 所在 Heap | 特徵 |
|---|---|---|
| MethodTable | High-Frequency Heap (AppDomain 私有) | 類型熱數據:方法槽、介面映射、介面表指標 |
| MethodDesc / FieldDesc | Low-Frequency Heap | 冷數據:方法/欄位詳細描述 |
| JIT 編譯代碼 | JIT Code Heap | 原生機器碼 |
| 靜態欄位 | High-Frequency Heap (MethodTable 內) | 每個 AppDomain 一份 |
| EEClass | Shared Domain / Loader Heap | 類型冷元資料:名稱、父類、介面列表、靜態建構函數 |
System.Object 的記憶體模型體現了 CLR 設計的核心哲學:
理解這套模型,是掌握 CLR 執行引擎、診斷記憶體洩漏、分析鎖爭用、編寫高效互操作代碼的基石。