程序中的內存分配:代碼和數據。堆棧。堆。在.NET中如何將內存分配給全局變量?
如果我有一個靜態/全局變量(可以說是一種基元類型),那麼理論就會建議當編譯的程序被加載時分配內存(在這個例子中忽略動態鏈接和加載,並假設程序包含一個模塊)。
但是如果全局變量是一個引用類型呢?運行時是否調整代碼/數據區域的內存分配?或者,引用僅存在於代碼/數據區域中,並指向堆中的內存區域?
程序中的內存分配:代碼和數據。堆棧。堆。在.NET中如何將內存分配給全局變量?
如果我有一個靜態/全局變量(可以說是一種基元類型),那麼理論就會建議當編譯的程序被加載時分配內存(在這個例子中忽略動態鏈接和加載,並假設程序包含一個模塊)。
但是如果全局變量是一個引用類型呢?運行時是否調整代碼/數據區域的內存分配?或者,引用僅存在於代碼/數據區域中,並指向堆中的內存區域?
靜態變量從AppDomain中的裝載機堆由JIT編譯器分配的IL時,將其轉換成機器代碼。它直接將地址編譯成代碼,非常高效。它一直存在,直到AppDomain卸載時堆被銷燬。這不是一個GC堆,變量地址永遠不會改變。
如果是引用類型的變量,那麼你寫了一些代碼後運行初始化變量。它將垃圾收集堆中的一塊內存地址存儲到變量中。然後,它就像垃圾收集器的任何其他引用一樣處理,在堆壓縮時更新值。當然如果你沒有明確地給變量賦一個空值的話,被引用對象最終會出現在第2代中的可能性非常高。
靜態變量被存儲在堆中,而不管它們是否引用類型或值類型中聲明。總共只有一個插槽,無論創建多少個實例。
這堆是從正常垃圾收集堆中分離 - 它被稱爲一個「高頻堆」,並有每個應用程序域之一。