我在一个小型linux控制器上有一个UDP服务器,大约有123 MB RAM,它与一个UDP客户端进行通信。在这个linux控制器上,c#应用程序运行mono 3.2.8。 一切都运行良好,除了udp连接快速消耗内存并且GC很少收集它(内存总是在控制台输出1和2之间正好增长65,552字节)。
我的客户端代码如下:
UdpClient udpClient = new UdpClient (port,AddressFamily.InterNetwork);
byte[] frame;
IPEndPoint masterEndPoint = null;
try
{
while(true)
{
masterEndPoint = null;
frame = null;
Console.WriteLine("Memory 1: " + GC.GetTotalMemory(false));
frame = _udpClient.Receive(ref masterEndPoint);
Console.WriteLine("Memory 2: " + GC.GetTotalMemory(false));
...
}
...
}
是否存在内存不会快速增长的可能性,例如使用缓冲区?如果不是可以更快地收集未引用的对象“masterEndPoint”和“frame”?
告诉我您是否需要进一步的细节!
任何帮助表示赞赏!
答案 0 :(得分:1)
我想我是靠自己解决的。我假设总是使用相同的缓冲区而不是新的缓冲区似乎是正确的,因为我不再有内存峰值(来自“top”命令的可用内存现在非常不变!)。
关键方法是:
int length = udpClient.Client.ReceiveFrom(buffer,ref endPoint);
我的解决方案如下:
UdpClient udpClient = new UdpClient (port,AddressFamily.InterNetwork);
udpClient.DontFragment = true;
...
byte[] frame = new frame[16384];
try
{
while(true)
{
EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
int length = udpClient.Client.ReceiveFrom(frame , ref endPoint);
...
udpClient.Send(responseFrame, responseFrame.Length,(IPEndPoint)endPoint);
}
...
}
如果您对清洁方式有任何建议,请告诉我们!
无论如何,谢谢你的帮助!