现在项目里用了几个winform程序,都是要一直不停的跑下去的.但跑了一段时间就会出OutOfMemoryException异常.
C# 垃圾回收不是由垃圾回收器自动回收的吗?是不需要自己手动回收. 那为什么程序跑着跑着就会出OutOfMemoryException异常呢?
有什么方式可以避免这个异常?
有什么方式会引起这个异常?
CLR 对资源分为托管资源与非托管资源
托管资源 CLR的GC会自动回收垃圾,但前提是被回收的对象不再被任何对象所引用,如果你程序中的资源长时间一直被占用,得不到释放,且不断增加,系统分配给CLR的可用内存是有限的,当超过可用内存时就会抛出异常OutOfMemoryException
非托管资源,如对文件的读写操作,读写完成后要及时关闭连接,CLR是没法自动回收这一部分资源的。
所以避的方法就是及时释放对于资源的占用,具体你就要细看你的代码了
这个异常很多情况下不是真的没有内存了才会抛的,比如加载图片格式无法解析时都会有。
建议在 Application.ThreadException 和 AppDomain.UnhandledException 事件中记录下异常的调用堆栈再分析。
c#确实是自动回收的。这个应该是越界了吧,跟踪一下程序执行情况,c确实是一个比较难的语言,这些错误常出现在初级开发人员。好好练,练过去了,就成长了。
垃圾回收是回收的失去引用的不再被程序使用的内存对象。人为造成的没办法的,例如你写个队列,只进不出,内存照样飙升。还有就是要注意一些文件操作,网络流等,需要手动DISPOSE或者ABORD。就算是自动回收的对象,也是不定时,不确定GC什么时候回收的。
看看这个http://www.cnblogs.com/JACKGhost/archive/2012/11/05/2755171.html
建议用profiler 看看内存到底在程序中被什么占用, 然后再找相应的解决方法。