c# - UDP通信快速填满内存

标签 c# linux mono udp

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

相关文章:

c# - 高效 XML 的 .NET 实现

c# - 更改轨道 NAudio 后 slider 不起作用

Xamarin 的 F# 交互板找不到单声道

c# - 如何在 Mono/Windows 上使用 gecko-sharp 嵌入 Gecko?

linux - 在 linux 中获取页面的 pte

c# - 没有订阅 SqlDependency

数学计算的 C# 编程最佳实践

c# - 在 C# 中使用结构是否有任何内存或 CPU 开销

php - UTF-8贯穿始终

Python-brisa 可在 Eclipse 中运行,但不能在 shell 中运行