现象
发现在客户端不断重复连接、发送、接受、关闭的过程,然后持续一天运行后,内存是在不断增加的,虽然增加的速度不快,一天下来,大概有20M增加到130M。但是由于项目会需要长时间运行(数月不关),所以肯定是不行的。
查找过程
首先在网上看到了socket有非托管资源,需要手动调用Dispose清除。然后在接收数据的回调函数中检测断联就将该套接字Dispose。发现还是无用。使用VS的内存快照看到的对象也基本是托管的,但找不到哪里引用的。之后还用了WinDbg查看,也找不到是为什么。然后还将能重复使用的对象都改成只new一次,仍然不能解决。之后用网口助手测试,发现基本是不是收发数据造成的内存泄露,而是客户端不断关闭,重连造成的。问题的位置就基本找到了。
解决办法
发现在接受数据回调函数里面判断客户端断连后要再异步调用一次服务器监听,测试一下将它屏蔽后就发现内存不再一直增长。看来原因就是这个。更深层的原因是什么,可能是跟异步监听回调函数里面有异步监听,而接受函数也有异步监听,二者重复造成冲突了吧