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

我有用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代,这样的话,回出现很长时间内存占用量很大。

最后祝你学业有成。 呵呵。。 在学习的路上只要有坚持的信念,就一定会得到很好的回报。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-09-23
晕,楼上的说的这么啰嗦。
你这样做就可以了。
你查询所有是不是返回了一个DataSet,你想啊,你每次单击都去创建一个DataSet肯定了。
你把DataSet定义为全局的。
每次查询时ds.Clear()一次,然后再给DataSet赋值,就不会了。
第2个回答  2009-09-22
GC.Collect();

c# 做的C\/S程序,在占的内存资源如何释放掉?
如果没有进行有效释放的话,会导制对象进行二次回收,也就是对象要回收两次才可以被真正的释放掉内存。如果第一次对象没有被释放掉,对象会对GC从0代放入1代,这样的话,回出现很长时间内存占用量很大。

开发C\/S架构用各种语言的优缺点有什么?
(25) “垃圾收集”意味着在Java中出现内存漏洞的情况会少得多,但也并非完全不可能(若调用一个用于分配存储空间的固有方法,垃圾收集器就不能对其进行跟踪监视)。然而,内存漏洞和资源漏洞多是由于编写不当的finalize()造成的,或是由于在已分配的一个块尾释放一种资源造成的(“破坏器”在此时显得特别方便)。垃圾收集...

C#中怎样使程序关闭后的变量值依然保存,即下次打开时还可以使用。是在...
方法一:文件操作。把变量的值记录在一个文件中。每次启动程序时,读取这个文件中的数字,储存于变量中。如果文件不存在,则使用默认值。方法二:注册表编程。把变量存在注册表的一个键值中。每次启动时,都读取注册表的这个键值,储存于变量中。如果这个键值不存在,则使用默认值。开发软件,一般采用第二...

c#如何获取其他应用程序的启动参数
Process[] processes = Process.GetProcessesByName(engineExeName);\/\/在进程列表中查找指定的QQ进程 foreach (Process p in processes){ string stitle = p.MainWindowTitle;}

如何为linux释放内存和缓存
在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了。Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer ...

软件工程设计师 C#、ASP.NET开发面试一般都会笔试和面试哪些题目,谢谢...
程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37. String s = new String("xyz");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 38. abstract class和interface有什么...

C#中堆和堆栈有什么不一样?
首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB)堆栈stack 堆栈中存储值类型。堆栈实际上是向下填充,即由高内存地址指向地内存地址填充。堆栈的工作方式是先分配内存的变量后释放(先进后出原则)。堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的...

VB.net开发C\/S产品功能如何
大家好.本人想学习VB.net然后用它来开发C\/S结构的软件.但并不需要在网络上应用.就是不知道这种语言的功能如何?因为都听说它比较适合开发WEB产品多点.请问大家用它开发桌面系统好,还是... 大家好.本人想学习VB.net然后用它来开发C\/S结构的软件.但并不需要在网络上应用.就是不知道这种语言的功能如何?因为都听说...

我的电脑里的java程序是不是重复了?系统是64位的,那个后缀是24的是...
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。58.堆和栈的区别?答: 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。59.成员变量和成员函数...

如何用c# 捆绑文件?
explorer---打开资源管理器 packager---对象包装程序 perfmon.msc---计算机性能监测程序 progman---程序管理器 regedit.exe---注册表 rsop.msc---组策略结果集 regedt32---注册表编辑器 rononce -p ---15秒关机 regsvr32 \/u *.dll---停止dll文件运行 regsvr32 \/u zipfldr.dll---取消ZIP支持...

相似回答
大家正在搜