2011-03-10 25 views
2

一些背景:隊列對象是否已從隊列對象中移除引用並允許GC?

我正在查看.NET框架中可用的各種集合對象,並試圖決定使用哪一個。

我必須通過集合中的每個對象,不一定通過它們枚舉,處理和刪除它。我必須在內存中執行此操作,數據集將很大(在演出中關閉)。我需要我的記憶足跡儘可能快地減少。

問題: Queue集合中是否有一個對象從隊列中引用,以便垃圾收集器可以完成它的工作? (假設沒有其他參照對象出隊)

+0

希望它應該使對象有資格進行垃圾回收,否則你會有一個非常嚴重的內存泄漏:) – dSebastien 2011-03-10 23:05:48

回答

5

如果你談論的是內置Queue<T>Queue集合然後,當一個對象被出列,然後以前認爲的對象的支持數組中的元素設置爲default(T)/null,這應該允許隨後收集該對象。

+1

附錄:這是*不是* ConcurrentQueue '的情況下,它通過不覆蓋元件。 – porges 2011-06-02 22:15:15

1

在幕後,Queue類維護一個內部圓形數組和兩個變量,用作循環數組開始和結束的標記:頭部和尾部。

Enqueue()方法首先確定是否有足夠的容量將新項目添加到隊列中。如果是這樣,它只是將元素添加到尾部索引處的循環數組中,然後使用模運算符「增加」尾部以確保尾部不超過內部數組的長度。但是,如果空間不足,陣列會增加一個特定的增長因子。此增長因子的默認值爲2.0,因此內部數組的大小加倍,但您可以在Queue類的構造函數中指定此因子。

The `Dequeue()` method returns the current element from the head index. 
It also sets the head index element to null and "increments" head. 

所以「出列」對象被設置爲空 ,後來根據需要GCed,雖然非確定性; GC運行的時間可能會有所不同。

0

假設您不保留對這些對象的其他引用,刪除它們會將它們標記爲GC,但不能保證集合實際發生的時間。如果您有其他參考,則這些對象將保留在內存中,直到這些參考被釋放。