【问题标题】:Garbage collection not functioning as expected垃圾收集未按预期运行
【发布时间】:2010-01-05 16:23:53
【问题描述】:

这可能是我使用托管语言缺乏经验的问题。问题本质上是对象方法中的一个循环,该循环执行大约 20 秒,在此循环的整个持续时间内,程序的整体内存使用量不断上升。现在,循环内所有被修改的变量都是在循环范围内定义的变量(即,没有类成员在循环内被更改/重新分配)。整个方法完成后,多余的内存仍在使用中。

我完全不知道为什么/哪里会出现这个问题,但这里有一些可能是一个因素:

  1. 我在循环中使用字体,但我对它们进行了 '.Dispose()' 并验证没有 GDI 泄漏。
  2. 我有 try/catch 语句正在使用中。
  3. 对象已分配...

因此,关于此问题可能来自何处的任何想法都会非常有帮助,我会发布代码,但其中有很多。同样如上所述,在方法调用完成后,即使在调用方法的对象超出范围之后,内存也不会被清理。

编辑

我也刚刚尝试了 GC.Collect() 方法,总体结果没有任何变化。我不知道,但这是否意味着内存不被视为“垃圾”?同样,所有分配都是在循环范围内完成的,因此在循环终止后不应将其视为垃圾。我知道 GC 不会立即清理它,但是使用 GC.Collect() 调用应该会强制这样做吗?

【问题讨论】:

标签: c# garbage-collection


【解决方案1】:

.NET 使用traced garbage collection 而不是classic reference counting 机制。

一旦您的 .NET 代码发布了一个对象或数据,它就不会立即被清理掉。在被清理之前它会坐一会儿。垃圾收集器是一个独立的实体。

微软关于垃圾收集器的声明

然而,记忆不是无限的。 最终垃圾收集器必须 执行收集以释放 一些记忆。

垃圾收集器会根据复杂的算法自行处理。如果不是在程序生命周期结束时,它最终会清理所有内容。不建议我们通过System.GC 成员戳或刺激垃圾收集器,因为我们应该假设它最了解。

【讨论】:

  • 是的,我有点认为它是这样的,问题是最终我的算法使用了 600+ Mb 的 RAM,这是......不可接受的。
【解决方案2】:

如果没有指向它们的指针,垃圾收集器将释放对象。确保不要在变量中保留不必要的对象(尤其是在数组中)。

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2012-04-21
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多