c# 做的C/S程序,在占的内存资源如何释放掉?

来源:百度知道 编辑:UC知道 时间:2024/06/09 06:08:34
我有用using 和托管对象dispose

但是我在观察程序占用内存占用时发现:
当我点击“查询所有”按钮时,内存就会增加,点越多,增加越多。
查询的数据库操作对象我全部using了。。。

请问这样内存占用的情况正常吗?如果不正常,如何通过代码进行管理?

朋友你问的很好,对于你提出的问题,我是这样想的。
C# 内存管理是基于优化的收集方式,引入了代的机制(共分3代0、1、2),当0代充满时或内存紧张时,垃圾收集器会挂起当前线程自动收集0代没有被引用的新建的对象,1代充满时收集1代,2代充满时收集2代。
见意最好不要手动进行GC的收集,这样会带来不必要的系统资源的浪费。
如果不进行人工干预内存太大的话,才可以使用手动回收GC.Collect()进行回收。
这个方法有2种参数
一种是:
GC.Collect() 这种方法对所有的代进行回收
一种是:
GC.Collect(int) 这种方法对0、1、2代,指明的代进行回收。

在这里,我见意在程序运行时监控一下内存占用量,如果一直持续占用内存很大而且没有减少的意思的话你可以使用手动的方法进行内存回收。
如果是间歇性的内存占用大的话,我不见意手动进行回收。因为,会占用资源。

还有一点要注意,在使用的类型含有Dispos()方法或Close()方法时,使用using或try{} finally{}进行释放,如果没有进行有效释放的话,会导制对象进行二次回收,也就是对象要回收两次才可以被真正的释放掉内存。如果第一次对象没有被释放掉,对象会对GC从0代放入1代,这样的话,回出现很长时间内存占用量很大。

最后祝你学业有成。 呵呵。。 在学习的路上只要有坚持的信念,就一定会得到很好的回报。

晕,楼上的说的这么啰嗦。
你这样做就可以了。
你查询所有是不是返回了一个DataSet,你想啊,你每次单击都去创建一个DataSet肯定了。
你把DataSet定义为全局的。
每次查询时ds.Clear()一次,然后再给DataSet赋值,就不会了。

GC.Collect();