3

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

我在这个简单的项目中所做的是创建两个表单:Form1 和 Form2

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

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

而 Form2 除了显示自己之外什么都不做,直到用户决定关闭窗口。

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

这是我的问题:

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

那么首先,这是内存泄漏吗?

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

4

2 回答 2

3

不要太在意事物的“样子”。.NET 很好地管理内存,如果它不收集它,那只是意味着你有足够的可用内存,那么它为什么要打扰呢?内存是可以使用的,而不是被囤积和保持自由的。

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

于 2013-05-08T02:39:43.403 回答
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?

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

于 2013-05-08T02:33:39.300 回答