C# 記憶體管理

衣舞晨風發表於2015-07-24

Windows使用一個系統:虛擬定址系統,該系統把程式可用的記憶體地址對映到硬體記憶體中的實際地址上,這些任務完全由Windows在後臺管理。其實際結果是”位處理器上的每個程式都可以使用4GB的記憶體ˉ—無論計算機上實際有多少硬碟空間(在64位處理器上,這個數字會更大。這個4GB的記憶體實際上包含了程式的所有部分,包括可執行程式碼、載入的所有DLL,以及程式執行時使用的所有變數的內容。這個4GB的記憶體稱為虛擬地址空間,或虛擬記憶體。

4GB中的每個儲存單元都是從0開始往上排序的。要訪問儲存在記憶體的某個空間中的一個值,就需要提供表示該儲存單元的數字。在任何複雜的高階語言中,如VB、C#和Java,編譯器負責把人們可以理解的變數名轉換為處理器可以理解的記憶體地址。

在程式的虛擬記憶體中 ,有一個區域稱為棧。棧儲存不是物件成員的值資料型別。另外,在呼叫一個方法時 ,也使用棧儲存傳遞給方法的所有引數的副本 。 

棧指標(作業系統維護的一個變數表示棧中下一個空閒儲存單元的地址。程式第一次開始執行時,棧指標指向為棧保留的記憶體塊末尾。棧實際上是向下填充的,即從高記憶體地址向低記憶體地址填充。當資料入棧後,棧指標就會隨之調整,以始終指向下一個空閒儲存單元。這種情況如圖13-1所示。在該圖中,顯示了棧指標8O000(十六進位制的OxC3500),下一個空閒儲存單元是地址799999。

注意,與棧不同,堆上的記憶體是向上分配的,所以空閒空間在已用空間的上面。

整理自:C#高階程式設計

擴充閱讀:

        .Net 垃圾回收機制原理(一)
.Net 垃圾回收機制原理(二)  
.Net 垃圾回收和大物件處理          
.NET中的六個重要概念:棧、堆、值型別、引用型別、裝箱和拆箱

相關文章