日期:2014-05-17  浏览次数:21096 次

如何释放DataSet占用的内存
请教vs.net 2005中,如何释放DataSet所占内存?
private void aa()
{
   //0.此处定义各代码段需要使用的相关资料
   DataSet ds=new DataSet()

   //1.处理代码1(处理完成后,ds中有很多表,总记录有几百万.)

   //2.处理代码2(此处还需要使用ds,但ds中的资料全部不要.此处处理完成后,ds中也有很多表,总记录有几百万.))

   //3.处理代码2(此处还需要使用ds,但ds中的资料全部不要.此处处理完成后,ds中也有很多表,总记录有几百万.))
}
我是通过线程启动aa的.请教大家,如何在各处理代码完成后,释放掉ds所占用的内存呀?--最多的时候此占用了1.2G的内存
我现在的处理方法是
ds=new DataSet();
System.GC.Collect();
但内存没有什么变化.

------解决方案--------------------
遍历ds,把ds中所有的DataTable全设为null,ds也设为null,然后垃圾回收试试。
------解决方案--------------------
原则是凡是从IDisposed接口继承的都调用Dispose方法,不是的你不用关心内存问题,这个问题是框架自己的任务。
------解决方案--------------------
调用System.GC.Collect() 之前,那ds赋值为null。
------解决方案--------------------
设置为null,然后立即回收(实际上也无法真正立即)
------解决方案--------------------
设为null

------解决方案--------------------
引用:
设置为null,然后立即回收(实际上也无法真正立即)

是的,其实按照DoNet的垃圾回收机制,即使显式调用GC也不能保证引用为null的对象一定被回收

DataSet的Dispose()方法也不能销毁DataSet和其中的数据,其实和Close()方法等效。
如果要清除DataSet可以先调用ds.Clear()方法,将其所有数据行清除,然后ds = null;
最后System.GC.Collect() //其实这时已经没必要调用GC了,而且不在万不得已的情况下尽量不要调用GC,这样会导致额外的系统开销