2015-11-06 70 views
1

我知道這個問題被問了很多次關於在stackoverflow中靜態類內存分配。但今天我讀了一篇文章,它讓我對內存分配感到困惑,因爲它提到像靜態類內存分配存儲在哪裏C#

單個對象存儲在堆中,靜態類存儲在堆棧中。

鏈接:http://www.dotnetjalps.com/2013/06/Static-vs-Singleton-in-Csharp-Difference-between-Singleton-and-Static.html

但在大多數計算器環節,它像

How is memory allocated for a static variable?

靜態變量存儲在堆中,無論它是一個引用內聲明被描述類型或值類型。總共只有一個插槽,無論創建多少個實例。

我很困惑堆棧或堆靜態類。內存如何分配給靜態類,爲什麼?內存如何分配給單個類。如果該問題太舊,請在評論中提供相關鏈接。

+1

類不會佔用內存,但會有對象。存儲在堆棧中的語句靜態類聽起來很荒謬。 –

+0

@sriram yes.what有關靜態變量? – SivaRajini

+0

@SivaRajini靜態變量存儲在堆的某處。 –

回答

7

類不會佔用內存,但會有對象。聲明「存儲在堆棧中的靜態類」對我來說聽起來很荒謬。

類不存儲在內存中。當一個類被加載時,它們的元數據可能被加載到內存中並被緩存。除了這些類不存儲在內存中。

問自己,如果靜態類被存儲在堆棧中,你怎麼能夠在所有線程中訪問它?

靜態變量

靜態變量是方法表 數據結構的一個重要組成部分。它們作爲MethodTable右側 的一部分分配在方法表槽數組之後。所有基元靜態類型都是內嵌的 ,而像結構和參考 類型的靜態值對象通過句柄表中創建的OBJECTREF來引用。 MethodTable中的OBJECTREF是指AppDomain 句柄表中的OBJECTREF,是指堆創建對象實例。一旦 創建,OBJECTREF的句柄表會直到應用程序域被卸載

參考this article for more info

請停止閱讀該博客文章或從作者的任何博客文章保持對象實例 堆上活着。這是完全荒謬的。

+0

請閱讀suren答案。像存儲在堆中的課程一樣被告知。 – SivaRajini

+0

我認爲,靜態類有一個記憶。請閱讀我的答案,如果我錯了糾正我 –

+0

@SurenSrapyan靜態類不存儲在任何地方。但是存儲靜態字段。它存儲在一些特殊位置的堆中。要知道我的答案中的特定位置是否讀取了blockquote部分 –

1

由Sriram Sakthivel解釋很好。基本上,堆內存分爲兩大部分。對象堆內存和Loader堆內存。按照我的理解,所有非靜態引用類型都存儲在對象堆中,並且所有靜態對象(可能是引用類型或值類型)都存儲在加載器堆中。 Gc從來沒有在加載堆上工作,這就是爲什麼他們只啓動一次並通過應用程序保留在內存中。

0

靜態變量出現在堆內的特殊原因。它被稱爲高頻堆,所有的靜態變量去內存高頻堆中的對象高頻堆不是垃圾收集的GC,因此在應用程序的整個生命週期中都可以使用靜態變量。

我們需要明確地取消分配它,然後我們必須將它設置爲null以便GC可以清除它的分配內存。