【问题标题】:C# .NET Memory Management with Data Structures (Dictionary, List, etc.)具有数据结构(字典、列表等)的 C# .NET 内存管理
【发布时间】:2011-03-11 20:38:32
【问题描述】:

我希望有人能阐明 .NET 在以下情况下如何处理垃圾收集。

我有一个程序,我需要执行一种非常特殊的“在文件中查找”功能,就像您在 Visual Studio 中看到的那样。我必须搜索可能数千个文件,并将结果收集到一个 List(Pair()) 对象中,其中 Pair 是我创建的一个简单类,用于存储一对项目(显然)。

当我使用完我需要的东西时,我会在列表中调用 Clear() 以清除旧信息。这似乎无助于释放内存,因为我可以在任务管理器中看到消耗的内存并没有减少。

对于一个非常大的搜索,我可能要处理需要处理的 5,000,000 行信息(我的机器上大约 500MB 的内存使用量)。当我的搜索完成时,内存消耗水平保持不变。我让我的 Pair 类实现了 IDisposable,但这并没有帮助。

知道我可能缺少什么吗?谢谢!

【问题讨论】:

  • 你在 Pair 对象中存储了什么?您只是存储文件路径还是实际上持有某种原生资源(如文件句柄?)
  • 调用“GC.Collect()”将强制垃圾收集运行。这应该可以帮助您立即查看清理了多少内存。然而,只使用 GC.Collect() 来调试这个问题 - 不要把它留在你的代码中,除非你绝对确定它应该在那里!

标签: c# .net data-structures memory-management garbage-collection


【解决方案1】:

垃圾回收会在需要时清除内存,也就是说,不是在你“清除”列表时,而是当它发现其中引用的所有项目都不再被引用时以及当进程/计算机内存不足时。

在 C# 中无需对内存进行微观管理。

【讨论】:

    【解决方案2】:

    .NET 垃圾收集器出奇的好。一般来说,您不必担心在任务管理器中看到的内存消耗,因为正如您所观察到的,垃圾收集器不会像您想的那样立即回收内存。这样做的原因是回收内存是一项昂贵的操作。如果那一刻不需要内存,为什么要在那里乱七八糟?内部工作是什么时候回收空间非常复杂。 GC 会通过不同级别的收集(称为世代)来回收针对速度优化的内存。

    有很多文章可以比我更详细地解释这一点。这是一个起点。

    http://msdn.microsoft.com/en-us/library/ms973837.aspx

    现在你应该看看你在什么时候最终会出现内存不足的异常,如果有的话,然后从那里开始。

    【讨论】:

      【解决方案3】:

      当您调用 Clear() 时,所有对 Pair 对象的引用都将被删除,这将导致这些对象被 GC最终 除非另一个对象持有对它们的引用,但您不能指望什么时候会发生 - 这也取决于内存压力。

      作为旁注,您可以在 C# 4 中使用 Tuple 而不是 Pair

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 2012-04-22
        • 2013-04-15
        • 1970-01-01
        • 2021-11-01
        • 2023-04-08
        • 1970-01-01
        • 2022-01-21
        • 2018-08-10
        相关资源
        最近更新 更多