【问题标题】:used memory doesn't decrease when forms close表单关闭时使用的内存不会减少
【发布时间】:2013-07-22 16:29:22
【问题描述】:

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

Form_Sell frm = new Form_Sell();
frm.Show();

当我显示许多表单时,我的程序使用的内存增加了,当我关闭所有新表单时,它并没有减少! (我在任务管理器中检查了我程序的已用内存)为什么会发生?我该怎么办?

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

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

【问题讨论】:

  • 这意味着你在某处持有对这些表单的引用。发生这种情况的方式有很多种,有些是显式的,有些是更微妙的(例如,在将事件处理程序分配给寿命较长的对象时,关闭 lambda 中的表单引用)。没有更多信息,我们真的没什么好说的。
  • @Servy 我用空表单测试它。没有控制,什么都没有。但是当我显示表单内存增加并且当我关闭它时内存不会减少!
  • 在这种情况下,GC 需要一些时间来清理内存。除非程序消耗大量内存到您开始实际耗尽或遇到其他问题的程度,否则不要担心。
  • @Servy 我的程序必须运行几个月而不会中断。并且以这种方式使用我的程序的内存太多了。我担心这个。
  • 那么你不需要担心内存会被马上清理干净,你只需要确保它最终被清理干净>,这就是 GC 会做的事情。在您实际使用它的情况下对其进行测试。如果您在几个小时内使用该程序时内存稳步增加,那么您可能在某个地方出现内存泄漏,但仅仅因为它增加了几秒钟并不意味着您有问题。

标签: c# winforms memory memory-management memory-leaks


【解决方案1】:

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

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

要真正强制 GC 清除内存,如果存在持有本机资源的项目,则单个 GC.Collect() 调用是不够的。试试这个:

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

试试看,看看你的记忆是否改变了。

【讨论】:

  • 请注意,虽然您的陈述在一般情况下是正确的,但 Form 将在不需要终结器运行的情况下被释放,因此 在这种情况下不需要这样做 i>.
【解决方案2】:

我认为你需要使用:

frm.Dispose();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2018-05-03
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多