winform 内存释放、垃圾回收
最近做一个winform项目,运行一段时间后,内存由刚启动的20M左右上升到100M以上,界面变得很卡,在无任何界面操作的情况下内存是不会上升的。
我在每个窗体关闭时都加了内存回收函数:GC.Collect()与定时调用系统内存释放函数:
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
后,内存占用小了,但是虚拟内存占用仍然高,操作一段时间后,界面又开始卡,求大神指点。。。。。
------解决方案--------------------不是加了GC.Collect就能回收,你要释放你的无用的对象,最好设置为null
------解决方案--------------------帮顶!你看下SQL日志呗 看看数据库连接的日志,是不是一直没有释放
------解决方案--------------------如果有数据一直不断读入内存,并在内存中不断处理,而没有得到及时的释放,会出现这种情况
虽然有自动垃圾回收GC,但是究竟在什么时候释放资源也只是未知数,可能最大的问题还是在于代码本身不够优化
很多时候是由于开发者自身对.NET底层机制不熟悉,比如在有些地方可以使用值类型而使用引用类型;创建了大量的临时的周期比较短的对象;使用了过多的静态变量及成员导致内存被长久占用而得不到回收;以及.NET内部的一些机制,比如集合对象会在内部预先分配多余的空间等等。很多时候因为有.NET的GC机制,使得我们不必去关注对象的销毁而很”大方”的去创建新对象,去使用一些重型的内置对象,从而导致内存占用过大。
------解决方案--------------------1楼版主说的对,用完直接 把对象=null (e.g.: obj = null;),就没引用了。
手动去强制垃圾回收例如:
Marshal.FinalReleaseComObject(obj);
GC.ReRegisterForFinalize(obj);
他们去做这些事也是会消耗资源的。
如果不确定哪些是否释放掉的话,
建议楼主多用using( ){ }语句块,
由系统去管理资源释放以节省不必要的麻烦。
------解决方案--------------------最后自己手动调用Dispose方法然后把该引用对象赋值为null,你调用GC.Collection方法垃圾回收器并不会立即回收的,垃圾回收器里有一个
代的概念的,更多垃圾回收的内容可以查看CLr via C# 的GC章节进行详细阅读下的
------解决方案--------------------如果对象还存在有引用 GC.Collect() 不会释放的,要是释放了,引用的就会出错嘛
频繁使用 GC.Collect() 进行收回反而会影响程序的性能
------解决方案--------------------100就卡,机器不行了吧,换个好点的
20--100,20分钟,扩展还真快
若是150的都是对象,那就多了去了
我缓存以张65535的表才1m多点
估计你那里的程序有了循环引用导致资源增加
仔细找找,你干了什么他就明显卡顿
软后查代码
要不发电片段上来