UDP通信快速填满内存

UDP communication fills up memory rapidly

我在一个小型 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"?

如果您需要更多详细信息,请告诉我!

感谢任何帮助!

我想我自己解决了。正如我假设的那样,总是使用相同的缓冲区而不是新的缓冲区似乎是正确的,因为我不再有内存峰值(来自 "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);
    }
...
}

如果您对更简洁的方法有任何建议,请告诉我!

谢谢你的帮助!