【问题标题】:.net does ArrayList.Clear free up memory?.net ArrayList.Clear 是否释放内存?
【发布时间】:2011-01-04 19:31:50
【问题描述】:

我有一个人口众多的数组列表,我想清除并重用它。如果我清除它会释放以前使用的内存吗?

我还应该提到,arraylist 是一个类的私有只读字段,在我第一次使用 arraylist 后仍有许多活动工作要做。所以我等不及类超出范围后的垃圾收集。

Clear 方法是否足够快?还是我应该销毁并创建一个新的数组列表?

问题更新:

如果我有这样声明的字段(感谢 Jon 的建议)

    /// <summary>
    /// Collection of tasks.
    /// </summary>
    private List<Task> tasks = new List<Task>();

然后我填充它....(大量)

现在如果不是清除和修剪,我可以打电话吗:

tasks = new List<Task>(); 

会推荐这个吗?

【问题讨论】:

  • +1 为乔恩,因为他已经真正报道过了。然而,Clear 无论如何都不会真正释放内存——只有垃圾收集器才会这样做。正确编写的 IDisposable 对象还在其 Dispose 实现中释放非托管内存 - 如果适用。也许我只是在迂腐:)
  • 很好,Andras,但我认为让该内存准备好进行垃圾收集就足够了。

标签: c# .net arraylist


【解决方案1】:

以更好地表达您的意图为准。您真的想要一个新列表吗?如果是这样,请创建一个新的。如果您从概念上想重用相同的列表,请致电Clear

ArrayList 的文档确实指出 Clear 保留了原始容量 - 所以您仍然会有一个大数组,但它会充满空值而不是对前面元素的引用:

Capacity 保持不变。重置 ArrayList的容量,调用 TrimToSize 或设置Capacity 直接属性。修剪一个空 ArrayList 设置容量 ArrayList 到默认容量。

顺便说一句,您使用 ArrayList 而不是 List&lt;T&gt; 的任何原因?

【讨论】:

  • 嗨乔恩,回答你的问题缺乏知识我猜,使用 List 有什么好处?
  • @JL:泛型集合通常更好:在编译时类型安全,更易于使用(不需要强制转换),值类型更高效......你使用的是什么版本的 .NET ? (它们仅适用于 .NET 2.0 及更高版本。)
  • Last q:如果我有一个人口众多的 List 并且在使用它之后将其值设置为 new List (显然 T = 我的班级) - 这会给我一个新的 List 并同时释放以前使用的内存用于垃圾收集?
  • 如果没有其他东西引用它,它会使以前的列表有资格进行垃圾收集,是的。当然,它实际上不会强制垃圾收集器运行 - 但通常这是一件好事。
【解决方案2】:

如果您希望内存真正被释放,请将其设置为 null 并调用垃圾收集器。然后创建一个新的 ArrayList。如果您将其设置为 null 然后创建一个新的,它最终会在需要额外内存时被垃圾收集。另外,我第二个通用集合。好久没用ArrayList了。

【讨论】:

  • 我同意 GC.Free(),我避免它。但是,我已经看到了必要的情况。我已经阅读了在场景之间的 XNA 游戏中使用它的技术,以避免在游戏中错误的时间进行垃圾收集......它有它的用途。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多