C#中的一个大列表使用了多少空闲内存

本文关键字:多少 内存 列表 一个 | 更新日期: 2023-09-27 18:25:36

我有一个名为Population的列表,它是一个包含很多职位的列表,有时我会停止使用它。我如何释放资源?那么这就是代码的一部分:

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

我使用了Clear方法,但不起作用。知道吗?

C#中的一个大列表使用了多少空闲内存

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

你有两个选择。

  1. 设置Population = null。这将展开整个对象实例,使其符合垃圾收集的条件。

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

好吧,由于垃圾收集器(GC)为您负责内存管理,所以您可以做的第一件事就是消除对列表(和所包含的元素)的所有引用,以便GC能够在下次删除它。例如,您可以通过显式设置来实现这一点

Population = null;

如果这对您来说还不够,例如,因为真的现在您可以接受非最佳运行时行为,您可以通过告诉GC现在开始收集对象

GC.Collect();

有关此方法的更多信息,请访问此处。

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

你能做的最好的事情就是什么都不做。垃圾回收器GC会自动为您完成这项工作。由于List不是IDisposable,您无法处理它。

Clear只会从List中删除元素,但不会对其进行处理

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

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

编辑,改写我关于处置的答案。好吧,当我输入Clean时,我一定是在想象一些事情。我假设,如果从列表中清除所有项目不是可用资源,那么您试图释放的资源是未管理的。基于这个假设,您需要BasePopulation来实现IDisposable,这样当垃圾收集器拾取该对象时,这些资源就可以被释放。

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