这可能是我使用托管语言缺乏经验的问题。这个问题本质上是对象方法中的一个循环,它执行了大约 20 秒,在这个循环的整个过程中,程序的整体内存使用量不断上升。现在,循环内所有被修改的变量都是在循环范围内定义的变量(即,没有类成员在循环内被更改/重新分配)。整个方法完成后,多余的内存仍在使用中。
我完全不知道这个问题的原因/位置,但这里有一些可能是一个因素:
- 我在循环中使用了字体,但我对它们进行了“.Dispose()”处理,并已验证没有 GDI 泄漏。
- 我有正在使用的 try/catch 语句。
- 对象被分配...
所以,关于这个问题可能来自何处的任何想法都会非常有帮助,我会发布代码,但有很多。同样如上所述,方法调用完成后内存不会被清理,甚至在调用该方法的对象超出范围后也是如此。
编辑
我也刚刚尝试了 GC.Collect() 方法,总体结果没有任何变化。我不知道,但这是否意味着内存不被视为“垃圾”?同样,所有分配都是在循环范围内完成的,因此在循环终止后不应将其视为垃圾。我知道 GC 不会立即开始清理它,但是使用 GC.Collect() 调用应该会强制清理它吗?
最佳答案
.NET 使用 traced garbage collection而不是 classic reference counting机制。
一旦您的 .NET 代码释放一个对象或数据,它不会立即被清理干净。在清理之前,它会放置一段时间。垃圾收集器是一个四处游荡的独立实体。
Microsoft 关于垃圾收集器的声明
However, memory is not infinite. Eventually the garbage collector must perform a collection in order to free some memory.
垃圾收集器会根据复杂的算法在空闲时出现。如果不是在程序生命周期结束时,它最终会清理所有内容。不建议我们通过 System.GC 戳或刺激垃圾收集器成员,因为我们应该假设它最了解。
关于c# - 垃圾收集未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004548/