0

我对我们系统的内存管理有疑问。

基本上这是我的设计:

  1. 加载记录列表。frmBrowse 使用的内存 90MB

  2. 点击记录后,会弹出另一个表格,即所选记录的详细表格 frmAP Memory used 110MB

    private void ViewRecord()
    {
        try
        {
            if(oAP!=null)
            oAP = new frmAP();
            oAP.LoadRecordDetails();
            oAP.Show();
        }
        catch (Exception ex)
        {
            clsClass.oGenMethods.ErrorMessage(ex.Message, "frmBrowse", "EditSearchFields");
        }
    }
    
  3. 当用户关闭时,我实际上隐藏它(frmAP)以防止重新查询数据,例如查找表和其他 - frmAP - 使用的内存 110MB

在 frmAP_Close()

this.Hide();

- 内存为 110MB

  1. 隐藏表单(frmSomeForm)后,内存保持在 110MB
  2. 当用户关闭调用/实例化“frmAP”的表单(frmBrowse)时

    公共无效 tsClose_Click(对象发送者,EventArgs e){

            if (oAP != null)
            {
                oAP .Dispose();
                oAP .Close();
                GC.Collect();
            }
    

    }

问题是内存仍然在 ~110MB 列表(frmBrowse)表单和记录表单(frmAp)是否已关闭。

请指教

提前致谢

更新:

我试图删除 .Hide() 以隔离问题,但内存仍在不断增长

4

1 回答 1

4

调用Close不会释放与对象关联的内存。这就是垃圾收集器的工作。Close或者Dispose只是告诉对象释放它正在使用的任何非托管内存或资源。该对象及其引用的所有内容仍保留在内存中。

为确保oAP被收集,请将其设置为 null:

oAP.Close();
oAP = null;

但是,这很可能是错误的做法。垃圾收集器的全部意义在于在需要时从未引用的对象中收集内存。所以让它做它的工作,不要强迫它运行,你不需要设置oAP为null,并且oAP它引用的所有内容都会在GC需要时收集。

于 2013-11-12T09:18:16.530 回答