只需打开和关闭对话框winform就会增加内存使用量

时间:2010-10-21 02:16:52

标签: c# memory-management

我正在尝试减少winForm应用程序的内存使用量。

应用程序中有一个主窗体和一个设置窗体。当按下“设置”按钮时,设置表单将弹出为模式窗体,设置窗体将从配置文件中加载app.config数据并将其作为Hashtable读取到内存中。设置窗体关闭后,它将从Windows.Forms.Form中调用Dispose方法。 Dispose方法就像将Hashtables和app.config对象设置为null一样简单。

将SettingForm显示为模态形式:

private void btnSettings_Click(object sender, EventArgs e)
    {
        frmConfig form = new frmConfig();
        form.StartPosition = FormStartPosition.CenterScreen;
        //MessageBox.Show(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase));
        form.ShowDialog(this);
        form.Dispose();
    }

处理方法:

 protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
            // Release managed resources
            Logger.Verbose("Disposing SettingForm");
            mySetting = null;
            testFtp = null;
        }
        base.Dispose(disposing);
    }

注意:mySetting是Class的一个实例,所有app.config数据都加载到Hashtable中,而testFtp是ftp函数的自定义对象。我应该为这两个类实现Dispose方法并使用

mySetting.Dispose();
testFtp.Dispose(); 

而不是将它们设置为null,因为它们是自己/处理非托管资源?

但每次按下“设置”按钮并关闭设置表单会增加私人字节数百K.内存泄漏?我怎么能摆脱它?

3 个答案:

答案 0 :(得分:2)

正如您在问题的最后提示,我建议您在mySettingtestFtp上实施IDisposable。一旦实现了以下内容,您应该会看到更好的资源清理:

 protected override void Dispose(bool disposing) {
    if (disposing && (components != null)) {
       components.Dispose();

       // Release managed resources
       Logger.Verbose("Disposing SettingForm");
       mySetting.Dispose();
       testFtp.Dispose();
    }

    base.Dispose(disposing);
 }

小编辑: 根据Nayan的回答和他所链接的答案:我强烈推荐IDisposable的实施。使用Forms并从Forms类尖叫中获取,“检查是否需要实施IDisposable。”这并不意味着您的代码应该实现它,只是您应该检查以确保您不需要它。表单通常会发布和订阅很多事件。表格也因成为一个包罗万象的资源桶而臭名昭着,IMO。

答案 1 :(得分:1)

由于其他一些代码,内存可能无法释放。由于您没有提供太多细节,我现在假设其他一切都是最佳的。

您正在使用的对象由垃圾收集器收集(如您所知)。但是当你想要它们时,它们可能不会从内存中释放出来。 .NET对象最好留给垃圾收集器。

根据为什么内存可能无法发布,you have the answers here.

将对象引用设置为null没有太大区别。另一方面,我个人记录了一些时间,对象回归活着(并推向老一代)因为你在使用它们时将null设置为相同。这是对GC的另一种干扰形式,但是你的选择。

您可能不需要实现IDisposable,但如果您正在使用流,操作系统句柄,非托管资源,那么您应该这样做。

修改

内存使用量可能很高,但只要不保持引用活动,GC就有责任释放它。因此,如果您已采取一切预防措施,那么您的应用程序似乎仍在消耗大量内存。这是可以接受的,因为释放未引用的对象是垃圾收集器的责任。

答案 2 :(得分:0)

为什么你认为这是泄密? GC没有义务立即释放内存,在某些情况下它可能永远不会实际执行收集,这没关系。

如果你真的需要立即释放这些千字节,你可能会迫使GC在处理后立即进行清理,但这通常是一项代价高昂的操作,可能会影响整体性能。