日期:2014-05-17  浏览次数:21080 次

出现神奇的错误,请大侠帮忙诊断下
一个程序运行2天,到第二天的2点多一点点,一定会出现这样的一个错误。

应用程序: TradeSever.exe
Framework 版本: v4.0.30319
说明: 由于未经处理的异常,进程终止。
异常信息: System.OutOfMemoryException
堆栈:
   在 System.Net.Sockets.Socket.AcceptCallback(System.Object)
   在 System.Net.Sockets.Socket.RegisteredWaitCallback(System.Object, Boolean)
   在 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)

应该是某个资源没释放导致的,也使用System.Gc进行强制回收了。但是还是要出错。请各位大侠帮忙诊断一下

------解决方案--------------------
会不会是socket连接过多造成的?

------解决方案--------------------
看看源代码什么的

------解决方案--------------------
耗的资源太多,溢出了

------解决方案--------------------
gc只能释放托管资源,而不能释放非托管资源
------解决方案--------------------
从异常上看是溢出了,你说定点定时的崩,是不是要考虑下外部因素啊?
------解决方案--------------------
看起来应该是 DataRead 方法里面出问题了
线程池异步调用那个方法,你在无限制循环里不断调用那个方法,占用越来越多的资源。
------解决方案--------------------
应该是线程太多,导致资源耗尽
定时出问题,可能是使用软件的环境有规律吧,或者软件要处理的业务本身有规律
------解决方案--------------------
主要考虑还是外部因素吧.

如果确定是每天2点多出现崩溃的话,那应该不考虑算法和资源的问题.如果是线程多,不会那么准时,如果是占用资源过多也不会准时崩溃.

还是研究一下线程主要功能是什么,比如说是像服务器发送数据,那么2点多时候,服务器是否有程序2点多的时候运行,比如说定时备份之类的,造成网络通道或者某些公用资源的抢占.在比如说如果线程执行的任务是读取网络数据,那2点多的时候是不是对方的网络有什么问题啊,服务器重启之类的.我只是打比方啊,具体的得自己分析分析.就研究一下你的机器和目标机器之间在2点多的时候有什么交互.
------解决方案--------------------
Accept的回调函数里面有问题。

------解决方案--------------------
为什么不一开始就把
int length = BitConverter.ToInt32(dataLengthBuf, 0);


这句话放到 TRY CATCH里呢?