C#中大型列表如何使用可用内存?
我有一个名为Population
的列表,是很多位置的很好的列表,在某些时候我停止使用它。 我如何释放资源? 那么这是代码的一部分:
private List Population=new List (); Population.SomeMethod(); Population.Clear();
我使用了Clear方法,但没有用。 任何的想法?
问题可能是Clear
没有按照您的想法行事。 Clear
只是将List
标记为空,而不调整其在幕后使用的内部数组。 但是,它将删除对各个BasePopulation
实例的所有引用。 因此,如果没有其他数据结构可以引用它们,则它们将有资格进行垃圾回收。 但是,它不会直接减小List
的大小。 我刚用ILSpyvalidation了这一点。
你有两个选择。
-
设置
Population = null
。 这将取消整个对象实例的根目录,使其符合垃圾回收的条件。 -
在此
List
上调用TrimExcess
。 这将调整内部数组的大小。
好吧,既然垃圾收集器(GC)正在为您处理内存管理,您可以做的第一件事是删除对列表的所有引用(以及包含的元素),以便GC能够删除它下一次。 例如,您可以通过显式设置来执行此操作
Population = null;
如果这对您来说还不够,例如因为您现在非常渴望摆脱对象并且您可以接受非最佳的运行时行为,那么您可以告诉GC 现在开始收集对象
GC.Collect();
有关此方法的更多信息,请参见此处 。
如上所述,这种做法可能会导致性能下降,因为它会强制GC在程序中通常不会清理资源。 因此通常不鼓励直接调用该方法,但如果这是您应用程序中的特殊点,它可能会满足您的需求。 作为一个实际的例子,我成功地改进了一个程序中的峰值内存使用,该程序在初始化期间需要大量对象,一旦实际程序执行开始就可以丢弃。 这里,初始化后调用GC.Collect()
性能损失很小是合理的。
你能做的最好的事情就是什么都没有。 垃圾收集器GC会自动为您完成此任务。 由于List不是IDisposable
您无法处置它。
Clear
只会从List中删除元素,但不会丢弃它。
编辑,重写我关于Disposing的回答。 好吧,当我输入Clean时,我一定是在想象。 我假设如果清除列表中的所有项目不是免费资源,那么您尝试释放的资源将不受管理。 基于该假设,您将需要BasePopulation来实现IDisposable,以便当垃圾收集器拾取该对象时,可以释放这些资源。
http://msdn.microsoft.com/en-us/library/system.idisposable.aspx