繁体   English   中英

C# 中的大列表如何使用空闲内存?

[英]How free memory used by a large list in C#?

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

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

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

问题可能在于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM