我有一个名为Population
的列表,是很多位置的绝佳列表,在某些时候我停止使用它。我如何释放资源?
然后这是代码的一部分:
private List <BasePopulation> Population=new List <BasePopulation>();
Population.SomeMethod();
Population.Clear();
我使用了Clear方法,但没有用。有什么想法吗?
答案 0 :(得分:31)
问题可能是Clear
没有按照您的想法行事。 Clear
只是将List
标记为空,而不调整其在幕后使用的内部数组的大小。但是,它将删除对各个BasePopulation
实例的所有引用。因此,如果没有其他数据结构可以引用它们,则它们将有资格进行垃圾回收。但是,它会不直接减小List
的大小。我刚刚使用ILSpy验证了这一点。
您有两种选择。
设置Population = null
。这将取消整个对象实例的连接,使其符合垃圾回收的条件。
在此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