插槽不会释放内存
本文关键字:内存 释放 插槽 | 更新日期: 2023-09-27 18:30:52
我写了一个非常简单的套接字,它只会向网络中的设备发送 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;
提前感谢您的帮助,
C# 使用托管内存。 这意味着有一个垃圾回收器定期运行并回收它可以验证的内存是否不再被使用。 它不会在离开范围的那一刻清理所有内容;尝试这样做是非常昂贵的。 相反,它会等到超过设定的内存阈值后再进行扫描以查找要清理的内容。 因此,您会看到程序的内存随着时间的推移而缓慢增加,但每隔一段时间它就会下降。 如果没有发生这种情况,则意味着您的程序使用很少的内存,或者运行速度如此之快,以至于GC甚至没有机会(或觉得需要)回收内存。 (或者这可能意味着程序中几乎没有内存可以回收。
除非你到了程序占用大量内存的地步,或者你开始出现内存错误,否则你不应该关心这个;只要让GC完成它的工作。
类套接字实现了接口 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;
}