2011-06-28 78 views
5

我明白有引用類型的垃圾回收,但我想知道垃圾回收如何處理值類型。是否收集垃圾價值類型?

值類型在超出範圍時是否會收集垃圾?

+0

可能重複的[值類型獲取垃圾收集?](http ://stackoverflow.com/questions/2342772/do-value-types-get-garbage-collected) – nawfal

回答

-1

值類型存儲在堆棧上。這意味着,運行時會將指針指向每個方法的堆棧頂部,並且當您從方法返回時,此頂部將向下移動。使此方法中聲明的任何變量超出範圍。

對於類字段,這些字段被存儲在具體類的內存中,並作爲類本身的一部分進行垃圾收集。

+0

-1並非所有的值類型都在堆棧中。 –

+0

我們正在根據「何時值類型的變量超出範圍」來討論方法中的局部變量。所有這些都存儲在堆棧中。 – Euphoric

+0

@Euphoric:並非所有變量都是參數。 OP沒有具體詢問參數;有多種其他方式可以使變量超出範圍。 –

10

只有存儲分配在必須被垃圾收集。

如果一個值類型變量是在堆上,它的一些其它類的任一部分,或者裝箱值,這是其中僅包含值類型值的對象。該值是包含垃圾收集對象時「釋放」的內存的一部分。

如果一個值類型變量位於堆棧上,當堆棧框架被返回的方法彈出時,它使用的內存將被有效「釋放」。

請注意,什麼最終在堆棧上,什麼最終在堆上是一個implementation detail這是由捕獲的變量,迭代塊,異步方法,ref參數等更復雜。但廣泛的原則是,使用的內存對於值類型值始終是「別的東西」的一部分 - 所以當回收那個「別的東西」的內存時它會被回收。 (這不是某種單獨的步驟 - 無論是對象還是堆棧幀,該值都存儲在內存中「其他」)。