我决定用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应用程序显然比这复杂得多,如果有的话,这种类型的内存增加很可能只占我所看到的整体内存增加的一部分。尽管如此,它仍然引人注目,并且在具有多种形式的项目中,这在任务管理器中看起来非常糟糕,因为它看起来像是内存泄漏。
首先,这是内存泄漏吗?
其次,即使不是,有什么办法可以阻止这种情况吗?
答案 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决定。