内存是否在 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 事件添加事件处理程序。您需要在 gfxScreenshot 和 bmpScreenshot 对象上调用 Dispose() 方法。当然,那些 HondaDb 对象也需要某种清理。
做不假设会立即解决内存使用增量,GC不急于释放地址space回操作系统。保留它而不是假设您可能很快就会需要它。正确的使用模式是一段时间后稳定在一个合理的数量,然后突然下降并重新建立起来。锯齿形图案。编写一个小的单元测试,反复调用创建和销毁您的表单对象,确保它执行截屏和访问数据库等重要工作。现在您可以自信地知道您没有 运行-away 泄漏问题。
我正在开发具有大量表单打开和关闭操作的反馈应用程序。当我启动我的应用程序需要 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 事件添加事件处理程序。您需要在 gfxScreenshot 和 bmpScreenshot 对象上调用 Dispose() 方法。当然,那些 HondaDb 对象也需要某种清理。
做不假设会立即解决内存使用增量,GC不急于释放地址space回操作系统。保留它而不是假设您可能很快就会需要它。正确的使用模式是一段时间后稳定在一个合理的数量,然后突然下降并重新建立起来。锯齿形图案。编写一个小的单元测试,反复调用创建和销毁您的表单对象,确保它执行截屏和访问数据库等重要工作。现在您可以自信地知道您没有 运行-away 泄漏问题。