UDP通信迅速填满内存

时间:2015-09-28 15:29:51

标签: c# linux mono udp

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

告诉我您是否需要进一步的细节!

任何帮助表示赞赏!

1 个答案:

答案 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);
    }
...
}

如果您对清洁方式有任何建议,请告诉我们!

无论如何,谢谢你的帮助!