当前位置: 首页 > 编程语言 > C#

大列表如何使用C#中的可用内存?分享

时间:2023-04-10 20:43:12 C#

C#中的大列表如何使用可用内存?我有一个名为Population的列表,它是一个很好的列表,可以列出很多地点,但在某些时候我不再使用它了。我如何释放资源?所以这是代码的一部分:privateListPopulation=newList();人口.SomeMethod();人口.清除();我使用了清除方法,但没有用。有任何想法吗?问题可能是Clear没有按照您的想法行事。Clear只是将List标记为空,而不调整它在幕后使用的内部数组。但是,它将删除对单个BasePopulation实例的所有引用。因此,如果没有其他数据结构可以引用它们,它们将有资格进行垃圾回收。但是,它并没有直接减少List的大小。我刚刚用ILSpy验证了这一点。你有两个选择。设置人口=空。这将unroot整个对象实例,使其符合垃圾回收条件。在此列表上调用TrimExcess。这将调整内部数组的大小。好吧,现在垃圾收集器(GC)正在为您处理内存管理,您可以做的第一件事就是删除对列表(及其包含的元素)的所有引用,以便GC下次能够删除它.例如,您可以通过显式设置Population=null;来做到这一点。如果这对你来说还不够,例如因为你现在非常渴望摆脱对象并且你可以接受非最优的运行时行为,那么你可以告诉GC现在开始收集对象GC.Collect();有关此方法的更多信息,请参见此处。如上所述,这种做法会导致性能不佳,因为它会强制GC清理通常不会在程序中完成的资源。因此,通常不鼓励直接调用该方法,但如果这是您应用程序中的一个特殊点,它可能适合您的需要。作为一个实际示例,我设法改善了一个程序的峰值内存使用情况,该程序在初始化期间需要大量对象,一旦实际程序开始执行,这些对象可能会被丢弃。在这里,在初始化后调用GC.Collect()是合理的,性能损失很小。你能做的最好的事情就是一无所有。垃圾收集器GC会自动为您执行此操作。由于List不是IDisposable,因此您无法处置它。Clear只会从List中删除元素,而不会丢弃它。编辑,重写我关于处置的答案。好吧,当我输入Clean时,我一定是在想象。我假设如果清除列表中的所有项目不是免费资源,那么您尝试免费的资源将不受管理。基于该假设,您将需要BasePopulation来实现IDisposable,以便当垃圾收集器拾取对象时,可以释放这些资源。http://msdn.microsoft.com/en-us/library/system.idisposable.aspx以上是C#学习教程:C#中的大列表如何使用可用内存?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: