内存是否在 Form.close() 上释放?

Is memory released on Form.close()?

我正在开发具有大量表单打开和关闭操作的反馈应用程序。当我启动我的应用程序需要 25 MB 时,我注意到我的应用程序中的内存变化很少。用户每给它一个反馈,它就会增加 3 MB 的内存使用量。在我使用 this.close() 的每一种形式上,当它从一个跳到另一个或有任何关闭操作时。内存增加的可能原因是什么

我是否需要手动调用垃圾收集器,因为每个人都说这不是好的做法。

在此我使用双显示器场景,其中应用程序每 500 毫秒拍摄一次辅助屏幕快照并将其显示在主屏幕上。为此,我使用如下所示的代码:

public EntryForm()
{
    sc = Screen.AllScreens;
    dbDms = new HondaDb(UtilityFunctions.getServerConnection());
    db = new HondaDb(UtilityFunctions.getClientConnection());
    bmpScreenshot = new Bitmap(sc[1].Bounds.Width,
                       sc[1].Bounds.Height,
                       PixelFormat.Format32bppArgb);

     Create a graphics object from the bitmap.
    gfxScreenshot = Graphics.FromImage(bmpScreenshot);
    Timer timerClientScreen = new Timer();
    timerClientScreen.Interval = 500;
    timerClientScreen.Enabled = false;
    timerClientScreen.Start();
     timerClientScreen.Tick += new EventHandler(timer_TickClient);
}

void timer_TickClient(object sender, EventArgs e)
{

    // Take the screenshot from the upper left corner to the right bottom corner.
    gfxScreenshot.CopyFromScreen(sc[1].Bounds.X, sc[1].Bounds.Y,
                                0, 0, sc[1].Bounds.Size, CopyPixelOperation.SourceCopy);
    // Save the screenshot to the specified path that the user has chosen.
    pictureBoxClient.Image = bmpScreenshot;
}

为了在打开其他表格时关闭表格,我使用下面的代码

formOpen.show();
formClose.Close();

建议我如何节省内存使用量。

不,当您调用 Form.Close() 时,您只是告诉我们关闭表单。该对象仍然存在于内存中,如果您有对它的引用,它将一直存在直到您持有该引用。

.NET 有自动垃圾收集机制,可以收集垃圾对象(你没有引用它们,也无法访问它们)。因此,当对象变成垃圾时,它们会从内存中删除,.NET 垃圾收集器开始工作。您可以通过调用 GC.Collect().

强制执行垃圾收集器

更多关于GC

看看这个MSDN Thread。这是关于一次性 Windows,这应该释放 class 的实例持有的所有资源。然后垃圾收集器应该完成它的工作。

确实如此,但只是您的 UI 对象。对于您使用的变量,它不是自动的。在这样的应用程序中,使用占用很少 GC 堆 space 但大量非托管资源的大对象,垃圾收集器通常不会 运行 经常足以让您远离麻烦。您必须提供帮助并显式 处理对象,这样您就不会将其留给 GC 来处理。

它可能需要很长时间才能启动 运行ning,在到达 运行 终结器之前,您可能会积累大量非托管内存使用。可能会因 OOM 而使您的程序崩溃,尽管您仍然 非常 远离该问题。现在你只是 运行宁 "heavy".

为 FormClosed 事件添加事件处理程序。您需要在 gfxScreenshotbmpScreenshot 对象上调用 Dispose() 方法。当然,那些 HondaDb 对象也需要某种清理。

假设会立即解决内存使用增量,GC不急于释放地址space回操作系统。保留它而不是假设您可能很快就会需要它。正确的使用模式是一段时间后稳定在一个合理的数量,然后突然下降并重新建立起来。锯齿形图案。编写一个小的单元测试,反复调用创建和销毁您的表单对象,确保它执行截屏和访问数据库等重要工作。现在您可以自信地知道您没有 运行-away 泄漏问题。