关于网络连接套接字Socket,关闭连接后,为什么程序的内存不会释放。 Socket.Close() 不能彻底关闭连接吗?如果可以的话,为什么关闭所有连接后,程序占用的内存不但没下降,还有上升的趋势呢?怎样才能彻底关闭连接? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Socket 本身占不了多少内存,是不是还有别的没释放? Close只是释放了非托管资源,也许本身就很小,所以看不到变化,你再GC.Collect()一下试试,肯定会小的 socket就一句柄,显式实现DISPOSE接口使用using语法,资源回收会及时一些,但也是系统回收,并不能做到实时。所以不要指望实时回收内存了 没有实时回收,我是通过定时发送测试包,代码 如下,谁看看 可不可以实现内存释放 /// <summary> /// 设定定时器,定时向客户端发送消息,看连接是否存活 /// </summary> private void tm_ClientConnTest_Tick(object sender, EventArgs e) { if (workerSocketList.Count <= 0) { return; } for (int index = 0; index < workerSocketList.Count; index++) { Socket socket = (Socket)workerSocketList[index]; try { socket.Send(Encoding.Default.GetBytes("test")); } catch { //当前连接已不存在,关闭连接,减小客户端计数器,从客户列表中移除连接对象,更新客户端列表 socket.Close(); Interlocked.Decrement(ref this.ClientNumber); this.workerSocketList.Remove(socket); this.UpdateClientListControl(); } } } 托管资源的回收,系统会定时自动执行吧,GC.Collect()意义不大,是不是程序运行后,就很难回到最初的内存使用大小?因为 服务器要运行比较长的时间,所以对内存要求比较大,大家还有什么办法吗? 有涉及数据存储和数据传输,不过那些方法现在都还没调用,一些自定义对象倒是有,不过个人感觉影响不大吧内存占用大概是4000K 左右,打开十个客户端,连接后是4300K左右,主要是关闭后,内存还是4300K . 是不是这些微小的变化可以忽略不计? 可是对于一个要运行一两个月的服务器,在客户端连接次数不知道的情况下,可能 这样的增长足够让服务器在一两个月后崩溃吧 4000K 是不是4M啊?现在服务器一般都有12G内存吧 另外,不要死盯着socket这里,可能是别的地方占了资源,例如:字符串操作,new()了太多对象,拷贝内存等等慢慢优化吧 4000K 很正常,而且大部分是操作系统占用的,跟你的代码无关,只要你 socket 保证关了,其他的托管部分也不会造成内存泄漏,不用担心这个 大并发量下的线程数据问题 怎么声明一个控件变量使得整个窗口可用? 应用程序错误“0x00392ace"指令引用的“0x0000002d”内存,该内存不能为“written” 帮忙写个正则表达式(C#) 请教一个substring的问题 vista下不能写配置文件?说没有权限! 多线程socket!!!!!!!!!!!!! vs2005简体版写的程序怎么不能在繁体版的WINDOWS2003下运行 如何让GridView默认显示最后一页,并且保证翻页的正确 using System.Net.Http问题 一个简单的问题 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
使用using语法,资源回收会及时一些,但也是系统回收,并不能做到实时。
所以不要指望实时回收内存了
代码 如下,谁看看 可不可以实现内存释放 /// <summary>
/// 设定定时器,定时向客户端发送消息,看连接是否存活
/// </summary>
private void tm_ClientConnTest_Tick(object sender, EventArgs e)
{
if (workerSocketList.Count <= 0)
{
return;
} for (int index = 0; index < workerSocketList.Count; index++)
{
Socket socket = (Socket)workerSocketList[index];
try
{
socket.Send(Encoding.Default.GetBytes("test"));
}
catch
{
//当前连接已不存在,关闭连接,减小客户端计数器,从客户列表中移除连接对象,更新客户端列表
socket.Close();
Interlocked.Decrement(ref this.ClientNumber);
this.workerSocketList.Remove(socket);
this.UpdateClientListControl();
}
}
}
托管资源的回收,系统会定时自动执行吧,GC.Collect()意义不大,是不是程序运行后,就很难回到最初的内存使用大小?因为 服务器要运行比较长的时间,所以对内存要求比较大,大家还有什么办法吗?
有涉及数据存储和数据传输,不过那些方法现在都还没调用,一些自定义对象倒是有,不过个人感觉影响不大吧
内存占用大概是4000K 左右,打开十个客户端,连接后是4300K左右,主要是关闭后,内存还是4300K . 是不是这些微小的变化可以忽略不计? 可是对于一个要运行一两个月的服务器,在客户端连接次数不知道的情况下,可能 这样的增长足够让服务器在一两个月后崩溃吧
慢慢优化吧