【发布时间】:2013-12-15 00:44:50
【问题描述】:
我正在开发一个 MDI 风格的 winforms 应用程序,它将图像作为文档加载。一个文档可以包含许多存储为位图实例的图像。我发现当我关闭其中一个文档时,GC 并没有恢复内存。所以如果我打开和关闭一个文档几次,内存会增加很多。特别是当我的应用程序将图像存储为每个通道 16 位时,图像非常大。在打开关闭文档几次后,它实际上耗尽了内存。
起初我以为我有内存泄漏,但事实证明,当我关闭一个文档时,如果我调用 GC.Collect,那么内存被正确收集,我的问题就消失了。
我是否认为如果 GC.Collect 正在释放内存,这意味着我没有泄漏? GC 自己不这样做有什么原因吗?在这种情况下,有什么理由不明确使用 GC.Collect?
【问题讨论】:
-
您是在 Debug 或 Release 配置文件中对此进行测试吗?
-
在你测试这个的时候你还连接了调试器吗?附加调试器时,GC 对对象的持有时间更长(否则
Watch窗口将失败一半时间)。当你处理完 Bitmap 对象时,你是否也在处理它们? -
确保使用 using 子句包装位图/图像,以便正确处理它们。你需要小心位图/图像
-
它处于发布模式,不在调试器中运行。我确实在调试器中做了一些测试——所以这是一个有用的提示——谢谢
-
我所有的位图都被释放了。它们不能都在 using 语句中,但我在 Image 类中使用 IDisposable,并且还保持引用计数以确保。
标签: c# .net winforms memory garbage-collection