.Net 占用内存资源不释放问题

jsnjlhb 2011-07-19 05:32:41
我的程序是WinForm
现在遇到这样一个问题,程序运行运行着一段时间后,发现程序内存都快达到400M了,导致程序越来越缓慢,
特别时刷新界面的时候,如果界面控件比较多的,更是明显
所以我想问一下,如何有效释放内存?
网上有人提出用SetProcessWorkingSetSize,可这只是把物理内存转到虚拟内存,并不能解决实际问题
...全文
780 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
单骑走天涯 2011-07-28
  • 打赏
  • 举报
回复
17楼正解

.net的垃圾回收,是定时的循环机制
时间到后,会回收不再被使用的对象、资源

如果所有的类都实现IDispose接口,比较麻烦
但确实有效的、及时回收资源

如果没有实现IDispose接口,
将DataSet、DataTable、实例化的对象等
在使用完后, 直接在代码里对其设置为 null
这样,在垃圾回收时,才能被有效回收

另外,对字符串
最好不要使用 string a = "dsf"+"gfdg"+"lsdkfj"的方式
即:不要使用 + 号来组合字符串,
而使用 string.Format() 或 StringBuilder对象来处理
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
我做通信时候的做法:

1、通讯类创建类全局缓冲区,尽量不要在发送、接收处理时临时分配心空间。
2、使用GC.Collect(),对不得已临时分配空间强制释放。
3、实现IDispose接口,显示调用Dispose接口,加速托管资源释放。
4、重写Object.Finalize 方法,理非托管资源。
venya 2011-07-21
  • 打赏
  • 举报
回复
mark
jsnjlhb 2011-07-21
  • 打赏
  • 举报
回复
litaoye:
.net Memory Profile 没找到相应的中文操作说明文档,不太会操作

我的程序中会频繁的调用其他窗体程序,我每次都是new一个实例后显示
form1 frm=new form1
frm.ShowDiag()
这样会不会影响性能,对于此种情况是不是把窗体隐藏起来会节省内存资源呢?
  • 打赏
  • 举报
回复
欢迎.net家族的斗士们,踊跃加入,共同探讨微软.net的奥秘,共同维护和推广.net的应用!69594961
  • 打赏
  • 举报
回复
执行完毕了 要手动释放对象 垃圾回收
system.gc();
dispose();
绿色夹克衫 2011-07-19
  • 打赏
  • 举报
回复
建议lz用.net Memory Profile查一下,看看是哪些东西因为被引用了而没有释放!
鸭梨山大帝 2011-07-19
  • 打赏
  • 举报
回复
"那我程序中定义和引用的类呢,是属于托管的还是非托管的资源呢?也需要我手动回收吗?"

那就要看你定义,引用的类具体是什么了,有些是非托管资源,有些是托管资源.

非托管资源一般都需要手动回收. 例如,连接,文件句柄,直接申请的内存空间.

而这里提及的手动回收是指调用实现IDisposable接口的类的释放方法,还是指GC.Collect ?

很多情况下,我们无法保证托管代码中的类是否已经实现了IDisposable,所以在不明确的情况下,最好是释放一下.

另外,很多情况下,不需要我们人为手动去调用GC.Collect.

jsnjlhb 2011-07-19
  • 打赏
  • 举报
回复
我上网查询了一下,系统有垃圾回收机制回收托管资源,但窗体等属于非托管的,需要手动释放资源
那我程序中定义和引用的类呢,是属于托管的还是非托管的资源呢?也需要我手动回收吗?
鸭梨山大帝 2011-07-19
  • 打赏
  • 举报
回复
"所以我想问一下,如何有效释放内存?"

优化你的代码,查看是否有某处在不停或者不定时的申请内存,而且不释放.

Icedmilk 2011-07-19
  • 打赏
  • 举报
回复
只要你的代码中没有对空间的引用,就会被回收。

垃圾回收机制是运行在独立的线程上的,所以就算你不主动调用GC.Collect()也会释放

关机问题是,对象不再使用了就不要再保留对其的引用
jsnjlhb 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xuexiaodong2009 的回复:]
使用了自定义控件?动态生成了大量控件?
需要手动释放的
[/Quote]
我程序中使用了大量的自定义控件,请问这些控件该如何释放呢
tliang 2011-07-19
  • 打赏
  • 举报
回复
特别是非托管资源一定要手工释放,using。
wind4fly 2011-07-19
  • 打赏
  • 举报
回复
写小函数,用完立即释放。
叫我三三 2011-07-19
  • 打赏
  • 举报
回复
根据情况多用静态,
定义空字符串最好用string.empty;
用过不用的资源,都手动释放一下.
多用using(){}

云瑀 2011-07-19
  • 打赏
  • 举报
回复
GC.Collect();
xuexiaodong2009 2011-07-19
  • 打赏
  • 举报
回复
使用了自定义控件?动态生成了大量控件?
需要手动释放的
ohkuy 2011-07-19
  • 打赏
  • 举报
回复
自己把程序优化一下,
对象用完后就释放,
不要等CLR来做

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧