C# 写的一个程序 越运行占用内存越多
选出一段代码 看内存占用 望高手指点 
前端数字代表debug运行下 停在此段代码时该EXE内存的使用量 既运行到此处是使用了多少内存
为使查看清楚 从ACCESS中取出数据后 从DataTable中清除
 37772K           DataTable dt = new DataTable(tableName);
                  try
                  {
 37792K               _oleDbCommand.CommandText = _oleDbCommandText;
 37796K               OleDbDataAdapter oleDbAdapter = new OleDbDataAdapter(_oleDbCommand);               
 37800K               oleDbAdapter.Fill(dt);
 99780K               oleDbAdapter.Dispose();
 99476K               oleDbAdapter = null;
                  }
                  catch (Exception ex)
                  {
                      throw ex;
                  }
 99476K           dt.Clear();
 99476K           dt.Dispose();
 99492K           dt = null;
 99492K           GC.Collect();
 62575K           return dt;
从进入此方法 到出此方法 所有对象全部释放掉 但是丢失了248000K的内存
这只是一角
为什么呢?数据库联接方式
_oleDbConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=;";

解决方案 »

  1.   

    oleDbAdapter.Dispose();
    这句出现在try{},如果出现异常是可能不会被执行的。
      

  2.   

    using(DataTable dt = new DataTable(tableName))
    )
    这样可能好一些
      

  3.   

     
    To:zhoufoxcn
    不出现异常的时候一样不行
    现在不需要考虑异常的情况
      

  4.   


    MSDN 中对于DataAdapte的解释是这样的:
    DataAdapter 虽然仅使用所请求的记录来填充目标DataTable,但仍会使用返回整个查询的资源。
    你是否在把oleDbAdapter.Fill(dt),填充数据表后,应该断开与ACCESS数据库的连接,你试下这样能否减低系统内存占用。对于丢失感觉LS说的是对的,如果一直在丢那就真有问题了。
      

  5.   

    在加个
    finally{
    //里面用于清空所有对象
    }
      

  6.   

    MSDN 中对于DataAdapte的解释是这样的:
    DataAdapter 虽然仅使用所请求的记录来填充目标DataTable,但仍会使用返回整个查询的资源。
    你是否在把oleDbAdapter.Fill(dt),填充数据表后,应该断开与ACCESS数据库的连接,你试下这样能否减低系统内存占用。对于丢失感觉LS说的是对的,如果一直在丢那就真有问题了。
      

  7.   

    你的连接在哪开的啊?麻烦把代码贴全
    还有调用完GC后,它不会马上回收,没准是Table还没释放的过
    C#里看有没有内存泄露要取时间段平均值,单看一个方法看不出来。
      

  8.   

    试试把数据库换成SQL Server放在另外一台机器上,先查清楚是Access自己的问题还是你的代码的问题。