C#中大型列表如何使用可用内存?

时间:2013-07-30 19:07:40

标签: c# list garbage-collection

我有一个名为Population的列表,是很多位置的绝佳列表,在某些时候我停止使用它。我如何释放资源? 然后这是代码的一部分:

 private List <BasePopulation> Population=new List <BasePopulation>();
 Population.SomeMethod();
 Population.Clear();

我使用了Clear方法,但没有用。有什么想法吗?

5 个答案:

答案 0 :(得分:31)

问题可能是Clear没有按照您的想法行事。 Clear只是将List标记为空,而不调整其在幕后使用的内部数组的大小。但是,它将删除对各个BasePopulation实例的所有引用。因此,如果没有其他数据结构可以引用它们,则它们将有资格进行垃圾回收。但是,它会直接减小List的大小。我刚刚使用ILSpy验证了这一点。

您有两种选择。

  1. 设置Population = null。这将取消整个对象实例的连接,使其符合垃圾回收的条件。

  2. 在此TrimExcess上致电List。这将调整内部数组的大小。

答案 1 :(得分:8)

好吧,既然垃圾收集器(GC)正在为您处理内存管理,那么您可以做的第一件事是删除对列表的所有引用(以及包含的元素),以便GC能够在下一次删除它。例如,您可以通过显式设置

来执行此操作
Population = null;

如果这对你来说还不够,例如因为你真的渴望摆脱现在 你的对象可以接受非最佳运行时行为,您可以通过

告诉GC开始收集现在对象
GC.Collect();

有关此方法的更多信息,请参见here

如上所述,这种做法可能会导致性能下降,因为它会强制GC在程序中通常不会清理资源。因此通常不鼓励直接调用该方法,但如果这是您应用程序中的特殊点,它可能会满足您的需求。作为一个实际的例子,我在一个程序中成功地改进了峰值内存使用,该程序在初始化期间需要很多对象,一旦实际程序执行开始就可以丢弃。在这里,初始化后调用GC.Collect()的性能损失很小是合理的。

答案 2 :(得分:2)

你能做的最好的事情就是什么都没有。垃圾收集器GC会自动为您完成此任务。由于List不是IDisposable,您无法处置它。

Clear只会从列表中删除元素,但不会将其丢弃。

答案 3 :(得分:0)

您必须清除该列表,然后调用GC将其从内存中删除。如下采用广泛的方法:

public static void ClearMemory<T>(this List<T> lista)
{
    int identificador = GC.GetGeneration(lista);
    lista.Clear();
    GC.Collect(identificador, GCCollectionMode.Forced);
}

答案 4 :(得分:-2)

编辑,重写我关于Disposing的回答。 好吧,当我输入Clean时,我一定是在想象。我假设如果清除列表中的所有项目不是免费资源,那么您尝试释放的资源将不受管理。基于这个假设,您需要BasePopulation来实现IDisposable,这样当垃圾收集器接收到该对象时,就可以释放这些资源。

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx