gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:35:15 24 4
gpt4 key购买 nike

这可能是我使用托管语言缺乏经验的问题。这个问题本质上是对象方法中的一个循环,它执行了大约 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com