0

我编写了一个非常简单的套接字,它只向网络中的设备发送 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;

在此先感谢您的帮助,

4

2 回答 2

1

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

除非您的程序占用了大量内存,或者您开始​​出现内存不足错误,否则您不应该担心这一点;让 GC 完成它的工作。

于 2013-09-10T14:23:28.710 回答
-1

Class Sockets实现了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;
}
于 2013-09-10T14:12:17.170 回答