一个Winform程序如此简单 - 但我可以回忆一下吗?

时间:2013-05-08 00:34:16

标签: c# winforms memory-leaks

我决定用C#中的.NET 2.0做一个简单的Windows Form项目来测试,看看在我的其他主UI应用程序中究竟是什么导致了“不断增长的内存泄漏”。

我在这个简单的项目中所做的是创建两种形式:Form1&窗体2

Form1有一个大按钮,弹出一个新的Form2实例。

private void button1_Click(object sender, EventArgs e)
{
    Form2 fm2 = new Form2();
    fm2.ShowDialog();
    fm2.Dispose();
}

除了show本身之外,Form2什么都不做,直到用户决定关闭窗口。

现在,当我启动应用程序并按下Form1上的按钮时,我的内存使用量大约为100~kb。我会关闭弹出窗口,再次按下按钮,然后看到另一个100~kb的增量。我会做大约10-20次迭代。最后,我会看到从6,880 KB跳转 - >任务管理器中有8,684 KB。现在,它最终将停在某个数字(在这种情况下为8684 KB)。达到此目标后,它将不再增加。

这是我的问题:

我的主要UI应用程序显然比这复杂得多,如果有的话,这种类型的内存增加很可能只占我所看到的整体内存增加的一部分。尽管如此,它仍然引人注目,并且在具有多种形式的项目中,这在任务管理器中看起来非常糟糕,因为它看起来像是内存泄漏。

首先,这是内存泄漏吗?

其次,即使不是,有什么办法可以阻止这种情况吗?

2 个答案:

答案 0 :(得分:3)

不要过于担心“看起来像什么”。 .NET很好地管理内存,如果它没有收集它,它只是意味着你有足够的可用内存,所以它为什么要打扰?记忆是可以使用的,而不是囤积并保持自由。

这不是一个问题,它会在需要时自行处理。

答案 1 :(得分:2)

显示fm2表单的代码很好,没有内存泄漏。

So first of all, is this a memory leak?

不,不是。这就是.NET处理托管代码的方式。它将对象加载到内存中,并在决定这样做时释放它们。即使你的程序不需要它们,它们也可能留在内存中,直到垃圾收集器决定将它们删除。

Secondly, even if it wasn't, is there any way to prevent this?

总的来说NO。使用GC.Collect您可能会注意到一些MB的减量,尤其是当您处理需要很多MBytes的对象时,例如图像,但这并不意味着所有资源都从内存中释放。 NET决定。