C# 已用内存不';当窗体关闭时不会减少

C# 已用内存不';当窗体关闭时不会减少,c#,winforms,memory,memory-management,memory-leaks,C#,Winforms,Memory,Memory Management,Memory Leaks,我用C#(WinForms)编写了一个有多种形式的程序。我以这种方式显示表单: Form_Sell frm = new Form_Sell(); frm.Show(); 当我显示许多表单时,程序的已用内存增加,当我关闭所有新表单时,内存不会减少!(我在任务管理器中检查程序的已用内存)为什么会发生这种情况?我该怎么办 我在表单的FormClosed事件中使用了GC.Collect()。但它不起作用(对已用内存没有影响) 我用空表单测试它。没有控制,什么也没有。但当我显示窗体内存增加时,当我关闭它

我用C#(WinForms)编写了一个有多种形式的程序。我以这种方式显示表单:

Form_Sell frm = new Form_Sell();
frm.Show();
当我显示许多表单时,程序的已用内存增加,当我关闭所有新表单时,内存不会减少!(我在任务管理器中检查程序的已用内存)为什么会发生这种情况?我该怎么办

我在表单的FormClosed事件中使用了GC.Collect()。但它不起作用(对已用内存没有影响)

我用空表单测试它。没有控制,什么也没有。但当我显示窗体内存增加时,当我关闭它时,内存并没有减少


垃圾收集器是不确定的。它只有在感到压力时才会释放内存。因此,仅仅因为您关闭了
表单
,并不意味着它将立即从中释放内存

因此,仅检查任务管理器以查看是否已为单个
表单释放了内存
,并不是检测内存泄漏的好方法

要真正、真正地强制GC清除内存,如果存在包含本机资源的项,则仅调用一个
GC.Collect()
调用是不够的。请尝试以下方法:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

试试看,看看你的记忆力是否有变化。

我认为你需要使用:

frm.Dispose();

这样,它将释放已使用的内存。然后再次运行GC,看看会发生什么。

这意味着您在某个地方保留了对这些表单的引用。发生这种情况的方式有很多种,有些是显式的,有些则是更微妙的(例如在将事件处理程序分配给寿命较长的对象时关闭lambda中的表单引用)。没有更多的信息,我们真的没有什么可说的。@Servy我用空表单测试它。没有控制,什么也没有。但当我显示窗体内存增加时,当我关闭它时,内存并没有减少!在这种情况下,GC需要一些时间来清理内存。不要担心,除非程序占用了大量内存,以至于您开始实际运行或出现其他问题。@Servy我的程序必须运行几个月而不中断。而在这种情况下,我的程序占用了太多的内存。我担心这一点。然后你不需要担心内存会马上被清理,你只需要确保它最终会被清理,这就是GC将要做的。在实际使用它的环境下测试它。如果在几个小时内使用该程序时,内存稳步增加,则可能在某个地方出现内存泄漏,但仅仅因为内存增加几秒钟并不意味着您有问题。请注意,虽然您的陈述在一般情况下是正确的,
表单
将在不需要运行终结器的情况下进行处理,因此在这种情况下不需要使用终结器。