套接字不会释放内存

时间:2013-09-10 14:04:21

标签: c# winforms sockets networking network-programming

我写了一个非常简单的套接字,只向网络中的设备发送4个字节,一切正常,但是每次创建套接字的新瞬间,内存都会增加,它会保持不变释放记忆。我写的代码如下:

    Byte[] bytesSent = new byte[4];
    bytesSent[0] = (byte)2;
    bytesSent[1] = (byte)1;
    bytesSent[2] = (byte)1;
    bytesSent[3] = (byte)1;

    Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream,    ProtocolType.Tcp);
    sck.Connect(new IPEndPoint(IPAddress.Parse(ipAdd), 3152));
    sck.Send(bytesSent, SocketFlags.None);
    Thread.Sleep(10);
    sck.Shutdown(SocketShutdown.Both);
    sck.Close();
    bytesSent = null;

先谢谢你的帮助,

2 个答案:

答案 0 :(得分:1)

C#使用托管内存。这意味着有一个垃圾收集器定期运行并回收它可以验证不再使用的内存。它离开范围的那一刻它不会清理所有东西;这是非常昂贵的尝试。相反,它会等到它在内存之前通过设定的内存阈值并进行扫描以寻找要清理的内容。因此,你会看到你的程序随着时间的推移逐渐增加内存,但随后每隔一段时间它就会下降。如果没有发生这种情况,则意味着您的程序使用的内存非常少,或者运行得如此之快,以至于GC甚至没有机会(或感觉有必要)回收内存。 (或者它可能意味着在您的程序中几乎没有能够回收的内存。)

除非你达到程序占用大量内存的程度,或者你开始出现内存错误,否则你不应该对此感到担忧;让GC完成它的工作。

答案 1 :(得分:-1)

类套接字实现接口IDisposable,因此最好使用using语句,即

using(Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
sck.Connect(new IPEndPoint(IPAddress.Parse(ipAdd), 3152));
sck.Send(bytesSent, SocketFlags.None);
Thread.Sleep(10);
sck.Shutdown(SocketShutdown.Both);
sck.Close();
bytesSent = null;
}