首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 內存管理詳解:堆、棧、靜態存儲區與更多

     編輯:程式設計綜合問答

C# 內存架構核心概念

在 C# 中,內存並非簡單劃分為「堆」與「棧」兩部分,其實際管理機制更為精細。理解內存分區對於編寫高性能、避免內存洩漏的代碼至關重要。

兩大頂層分類:寄存器與內存

程序運行時,數據存儲首先分為 寄存器(CPU 內部,速度最快)和 內存(含緩存)。我們關注的主要是內存部分。

內存進一步劃分:代碼區與數據區

  • 代碼區:存放方法、屬性等可執行指令,通常為只讀。
  • 數據區:存放程序運行時使用的各類數據,再細分為靜態存儲區與運行時存儲區。

數據區的具體結構

1. 靜態存儲區

程序啟動時分配,運行期間一直存在,直到程序結束。

  • 全局靜態存儲:`static` 修飾的字段、單例對象等。
  • 常量區:`const` 常量、字符串字面量等不可變數據。

2. 運行時存儲區(動態內存)

隨對象創建/銷毀動態變化,分為兩大塊:

  • 棧:存儲值類型變量、方法參數、局部變量、引用類型的「引用指針」。遵循先進後出,分配釋放極快,但空間有限(通常 1MB)。
  • 堆:存儲所有引用類型的實例對象(類、數組、委托等)。由垃圾回收器(GC)自動管理,空間大但分配回收有開銷。

進階補充:大對象堆 (LOH) 與代際

.NET 運行時將堆進一步劃分為 小對象堆 (SOH) 和 大對象堆 (LOH,≥85KB)。LOH 不壓縮,僅在 Gen 2 回收。理解代際(Gen 0/1/2)有助於優化 GC 性能。

總結圖表

內存
├── 代碼區
└── 數據區
    ├── 靜態存儲區
    │   ├── 全局靜態
    │   └── 常量
    └── 運行時存儲
        ├── 棧
        └── 堆 (含 SOH / LOH / 代際)

掌握這層結構,才能在面對 `OutOfMemoryException`、高頻分配優化、非托管資源釋放等場景時遊刃有餘。

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