【发布时间】:2010-01-05 16:23:53
【问题描述】:
这可能是我使用托管语言缺乏经验的问题。问题本质上是对象方法中的一个循环,该循环执行大约 20 秒,在此循环的整个持续时间内,程序的整体内存使用量不断上升。现在,循环内所有被修改的变量都是在循环范围内定义的变量(即,没有类成员在循环内被更改/重新分配)。整个方法完成后,多余的内存仍在使用中。
我完全不知道为什么/哪里会出现这个问题,但这里有一些可能是一个因素:
- 我在循环中使用字体,但我对它们进行了 '.Dispose()' 并验证没有 GDI 泄漏。
- 我有 try/catch 语句正在使用中。
- 对象已分配...
因此,关于此问题可能来自何处的任何想法都会非常有帮助,我会发布代码,但其中有很多。同样如上所述,在方法调用完成后,即使在调用方法的对象超出范围之后,内存也不会被清理。
编辑
我也刚刚尝试了 GC.Collect() 方法,总体结果没有任何变化。我不知道,但这是否意味着内存不被视为“垃圾”?同样,所有分配都是在循环范围内完成的,因此在循环终止后不应将其视为垃圾。我知道 GC 不会立即清理它,但是使用 GC.Collect() 调用应该会强制这样做吗?
【问题讨论】:
-
使用托管内存分析器;这就是它的用途。其他一切都只是猜测。
-
我最喜欢的 C#/.NET 托管内存故事之一是普林斯顿 DARPA 大挑战团队 codeproject.com/KB/showcase/IfOnlyWedUsedANTSProfiler.aspx
标签: c# garbage-collection