记忆未被收集

时间:2013-11-28 21:53:55

标签: c# .net winforms memory garbage-collection

我正在开发一个MDI样式winforms应用程序,它将图像作为文档加载。一个文档可以容纳许多存储为Bitmap实例的图像。我发现当我关闭其中一个文件时,GC没有恢复内存。因此,如果我打开和关闭文档几次,内存会增加很多。特别是当我的应用程序将图像存储为每通道16位时,因此图像非常大。打开关闭文档几次后,它实际上会耗尽内存。

起初我以为我有内存泄漏,但事实证明,当我关闭文档时,如果我调用GC.Collect,则内存被正确收集,我的问题就消失了。

我是否正确地认为如果GC.Collect释放内存,那意味着我没有泄漏?并且有没有理由为什么GC不是自己做这个?有没有在这种情况下不明确使用GC.Collect的原因?

1 个答案:

答案 0 :(得分:0)

  1. 如果内存被收集,那么是的,你没有内存泄漏。
  2. 你不应该使用显式调用GC.Collect,因为它可能会对性能造成很大影响。 (只有在你必须的时候才这样做)
  3. 需要大量空间的物体(我不记得究竟多少)在第一代而不是第零代保存。这就是为什么他们将在相当长的一段时间内保持未收集状态,因为GC不会经常收集第一代对象。除非你强迫它。