31

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

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

我使用了清除方法,但不起作用。任何的想法?

4

5 回答 5

38

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

你有两个选择。

  1. 设置Population = null。这将取消整个对象实例的根,使其有资格进行垃圾收集。

  2. 呼吁TrimExcess这个List。这将调整内部数组的大小。

于 2013-07-30T20:04:42.697 回答
9

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

Population = null;

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

GC.Collect();

可以在此处找到有关此方法的更多信息。

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

于 2013-07-30T19:38:43.087 回答
3

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

Clear只会从 List 中删除元素,但不会处理它。

于 2013-07-30T19:19:25.887 回答
2

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

public static void ClearMemory<T>(this List<T> lista)
{
    int identificador = GC.GetGeneration(lista);
    lista.Clear();
    GC.Collect(identificador, GCCollectionMode.Forced);
}
于 2019-10-25T14:33:57.197 回答
-3

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

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

于 2013-07-30T19:09:40.333 回答