假设我有一个大列表,其中每个项目都被处理一次,然后在长时间操作期间不再查看:
List<T> items;
// ... some stuff is done with the list then finally
for(int i = 0; i < items.Count; i++)
{
SomeOperation(items[i]);
//items[i] never used again at this point
// say i do this:
// items[i] = null;
}
如果我取消注释items[i] = null
,这会取消索引处的对象吗i
并使其可用于垃圾收集?
从内存使用的角度来看,这样做与稍后在整个列表未使用时让 GC 发生相比会更有效吗?
这忽略了一些问题,例如稍后更改代码,结果发现这些项目稍后使用以及意外的空破坏破坏。
如果对该对象的唯一根可访问引用是通过该列表,那么是的,将该引用设置为null
将使该对象eligible用于垃圾收集。
当垃圾收集最终发生时,如果该对象最终被清理,而列表本身需要保留,那么您将根据该对象的大小减少应用程序的内存占用量。
请注意,为引用列表中的对象而分配的内存仍然存在;只有它引用的对象的内存可以被清理。
正如许多其他人所提到的,您对这种数据结构的使用强烈表明您不应该使用List
首先,而是一个Queue
或其他类似的数据结构,因为这会更有效地适合您的使用。
您还需要记住,内存很便宜;人们往往拥有很多。除非你有成千上万的对象,否则它们会长时间保持活动状态,否则这可能不足以让你注意到它;您甚至可能无法测量差异。使用正确的数据结构将为您带来所有这些好处,甚至更多,and使代码变得更加简单,并且更具可读性/可维护性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)