Socket.Close() 不能彻底关闭连接吗?如果可以的话,为什么关闭所有连接后,程序占用的内存不但没下降,还有上升的趋势呢?怎样才能彻底关闭连接?

解决方案 »

  1.   

    Socket 本身占不了多少内存,是不是还有别的没释放?
      

  2.   

    Close只是释放了非托管资源,也许本身就很小,所以看不到变化,你再GC.Collect()一下试试,肯定会小的
      

  3.   

    socket就一句柄,显式实现DISPOSE接口
    使用using语法,资源回收会及时一些,但也是系统回收,并不能做到实时。
    所以不要指望实时回收内存了
      

  4.   

    没有实时回收,我是通过定时发送测试包,
    代码 如下,谁看看 可不可以实现内存释放        /// <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();
                    }
                }
            }
      

  5.   


    托管资源的回收,系统会定时自动执行吧,GC.Collect()意义不大,是不是程序运行后,就很难回到最初的内存使用大小?因为 服务器要运行比较长的时间,所以对内存要求比较大,大家还有什么办法吗?
      

  6.   


    有涉及数据存储和数据传输,不过那些方法现在都还没调用,一些自定义对象倒是有,不过个人感觉影响不大吧
    内存占用大概是4000K 左右,打开十个客户端,连接后是4300K左右,主要是关闭后,内存还是4300K . 是不是这些微小的变化可以忽略不计? 可是对于一个要运行一两个月的服务器,在客户端连接次数不知道的情况下,可能 这样的增长足够让服务器在一两个月后崩溃吧
      

  7.   

    4000K 是不是4M啊?现在服务器一般都有12G内存吧
      

  8.   

    另外,不要死盯着socket这里,可能是别的地方占了资源,例如:字符串操作,new()了太多对象,拷贝内存等等
    慢慢优化吧
      

  9.   

    4000K 很正常,而且大部分是操作系统占用的,跟你的代码无关,只要你 socket 保证关了,其他的托管部分也不会造成内存泄漏,不用担心这个