出队对象是否从Queue对象中删除引用并允许GC?

时间:2011-03-10 23:02:40

标签: c# .net collections garbage-collection

一些背景:

我正在查看.NET框架中可用的各种集合对象,并尝试决定使用哪一个。

我必须遍历集合中的每个对象,不一定要通过它们进行枚举,处理和删除它。我必须在内存中执行此操作,数据集将很大(在演出中关闭)。我需要尽可能快地减少内存占用。

问题: 将Queue集合中的对象从队列中释放该对象,以便垃圾收集器可以完成其工作吗? (假设没有其他对出列物体的引用)

3 个答案:

答案 0 :(得分:5)

如果您正在讨论内置的Queue<T>Queue集合,那么,当一个对象出列时,那么前面持有的后备数组中的元素该对象设置为default(T) / null,这应该允许随后收集该对象。

答案 1 :(得分:2)

在幕后,Queue类维护一个内部圆形数组和两个变量,用作圆形数组开头和结尾的标记:head和tail。

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.
  

所以'dequeued'对象设置为   尽管是非确定性的,但是根据需要在GCed上为null和更高版本; GC运行的时间可能会有所不同。

答案 2 :(得分:0)

假设您没有对这些对象进行其他引用,删除它们会将它们标记为GC,但无法保证何时实际发生该集合。如果您有其他引用,则对象将保留在内存中,直到这些引用被释放。