在 C# 中,內存並非簡單劃分為「堆」與「棧」兩部分,其實際管理機制更為精細。理解內存分區對於編寫高性能、避免內存洩漏的代碼至關重要。
程序運行時,數據存儲首先分為 寄存器(CPU 內部,速度最快)和 內存(含緩存)。我們關注的主要是內存部分。
程序啟動時分配,運行期間一直存在,直到程序結束。
隨對象創建/銷毀動態變化,分為兩大塊:
.NET 運行時將堆進一步劃分為 小對象堆 (SOH) 和 大對象堆 (LOH,≥85KB)。LOH 不壓縮,僅在 Gen 2 回收。理解代際(Gen 0/1/2)有助於優化 GC 性能。
內存
├── 代碼區
└── 數據區
├── 靜態存儲區
│ ├── 全局靜態
│ └── 常量
└── 運行時存儲
├── 棧
└── 堆 (含 SOH / LOH / 代際)
掌握這層結構,才能在面對 `OutOfMemoryException`、高頻分配優化、非托管資源釋放等場景時遊刃有餘。