首页 新闻 会员 周边 捐助

关于 OutOfMemoryException

0
悬赏园豆:50 [已解决问题] 解决于 2013-11-28 13:31

现在项目里用了几个winform程序,都是要一直不停的跑下去的.但跑了一段时间就会出OutOfMemoryException异常.

C# 垃圾回收不是由垃圾回收器自动回收的吗?是不需要自己手动回收. 那为什么程序跑着跑着就会出OutOfMemoryException异常呢?

有什么方式可以避免这个异常?

有什么方式会引起这个异常?

C#
jerry128的主页 jerry128 | 初学一级 | 园豆:31
提问于:2013-11-21 18:40
< >
分享
最佳答案
0

CLR 对资源分为托管资源与非托管资源

托管资源 CLR的GC会自动回收垃圾,但前提是被回收的对象不再被任何对象所引用,如果你程序中的资源长时间一直被占用,得不到释放,且不断增加,系统分配给CLR的可用内存是有限的,当超过可用内存时就会抛出异常OutOfMemoryException

非托管资源,如对文件的读写操作,读写完成后要及时关闭连接,CLR是没法自动回收这一部分资源的。

所以避的方法就是及时释放对于资源的占用,具体你就要细看你的代码了

Zery | 大侠五级 |园豆:6151 | 2013-11-21 22:11
其他回答(4)
0

这个异常很多情况下不是真的没有内存了才会抛的,比如加载图片格式无法解析时都会有。

 

建议在 Application.ThreadException 和 AppDomain.UnhandledException 事件中记录下异常的调用堆栈再分析。

deerchao | 园豆:8367 (大侠五级) | 2013-11-21 18:53
0

c#确实是自动回收的。这个应该是越界了吧,跟踪一下程序执行情况,c确实是一个比较难的语言,这些错误常出现在初级开发人员。好好练,练过去了,就成长了。

angelshelter | 园豆:9914 (大侠五级) | 2013-11-21 20:12
0

垃圾回收是回收的失去引用的不再被程序使用的内存对象。人为造成的没办法的,例如你写个队列,只进不出,内存照样飙升。还有就是要注意一些文件操作,网络流等,需要手动DISPOSE或者ABORD。就算是自动回收的对象,也是不定时,不确定GC什么时候回收的。

看看这个http://www.cnblogs.com/JACKGhost/archive/2012/11/05/2755171.html

大芝麻 | 园豆:4 (初学一级) | 2013-11-21 20:18
0

建议用profiler 看看内存到底在程序中被什么占用, 然后再找相应的解决方法。

收获园豆:50
gunsmoke | 园豆:3592 (老鸟四级) | 2013-11-25 07:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册