c# - 垃圾收集未按预期运行

标签 c# garbage-collection

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

我完全不知道这个问题的原因/位置,但这里有一些可能是一个因素:

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

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

编辑

我也刚刚尝试了 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/

相关文章:

c# - 如何使用 GC.KeepAlive() 以及用于什么目的?

Java HeapDumps 表明在 OutOfMemory 异常后使用的堆大小比实际堆定义小 30%

c# - 在程序运行时生成变量? C#

c# - 从 IEnumerable 中选择项目

c# - 在 Excel 工作表中保存 CustomProperty

c# - 有人可以解释在对象超出范围之前将其清零的意义是什么吗?

qt - 将字符串或其他非列表/树类型绑定(bind)到 qt 小部件的简单模型(mvvm 样式)

Java SWT GC 未在 Canvas 上绘制文本

c# - 如何处理这种竞争条件?

c# - 如何在 C# 中将代码块(不是完整方法)作为参数传递?