我在一个小型 Linux Controller 上有一个 UDP 服务器,该 Controller 具有大约 123 MB RAM,它与单个 UDP 客户端通信。在这个 linux Controller 上,一个 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”?
如果您需要更多详细信息,请告诉我!
感谢任何帮助!
最佳答案
我想我自己解决了。正如我假设的那样,总是使用相同的缓冲区而不是新的缓冲区似乎是正确的,因为我不再有内存峰值(来自“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);
}
...
}
如果您对更清洁的方法有任何建议,请告诉我!
还是感谢你的帮助!
关于c# - UDP通信快速填满内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826655/