我的程序要求每隔一段时间去读取数据库数据进行处理,但发现程序一运行到DATASET的代码程序占用的内存就会增长,代码如下: private void MyTimer_Tick(object sender, EventArgs e)
{
...
Cmd.CommandText = "Select * from T1";
da = new SqlDataAdapter(Cmd);
using (DataSet dataSet = new DataSet())
{
da.Fill(dataSet, "T1");
}
...
}当我把上述代码注释掉后,程序内存就正常了,不会再增长了。
{
...
Cmd.CommandText = "Select * from T1";
da = new SqlDataAdapter(Cmd);
using (DataSet dataSet = new DataSet())
{
da.Fill(dataSet, "T1");
}
...
}当我把上述代码注释掉后,程序内存就正常了,不会再增长了。
+1 每次都在不停地往内存里加东西,
建议你在运行完一次之后就
da.Dispose();释放一下。
要不你的机器过不了多久就会死机了。
这个da对象也是实现了IDisposable接口的,也是需要释放的
da.Dispose()
试过了,也是一样。还试了:
dataSet.Clear()以及dataSet.Reset(),都没有用
数据连接对象填充过后有没有关闭和释放,dataset有没有清除或重置。
数据连接对象有关闭,而且我是从外围一步步注释来测试的,最后发现是da.Fill(dataSet, "T1")这里导致内存增长的,但我试过用:
dataSet.Dispose()/dataSet.Tables["T1"].Clear;dataSet.Dispose()/
dataSet.Dispose();dataSet=null;/dataSet.Clear();dataSet.Dispose();
dataSet.Reset();dataSet.Dispose();dataSet=null
问题一样存在
难道dataSet的引用赋值给别的成员或者全局变亮了??
为了方便测试我现在把一些无关的代码都注释掉了,只剩下连接数据库,Fill数据集,然后释放资源,关闭连接,没有赋值之类的代码
CLR会在自己认为合适的时候来进行清理和回收
你这里无论做什么操作,都只是说这个对象你不会用了,但是你无法控制CLR到底在什么时候会进行垃圾清理和资源回收
如果你非要控制内存的话。
在使用之后,加上一句 System.GC.Collect();
强制CLR对所有General的垃圾资源进行回收。
不过是用CPU换内存空间而已,空间或时间的权衡了。
如果你的系统将来可能的运行环境对内存有要求的话,还是有必要的。