2015-09-28 70 views
0

我有一个小型的Linux控制器上的UDP服务器,有大约123 MB的RAM,它正在与一个UDP客户端通信。在这个linux控制器上,一个c#应用程序在单声道3.2.8上运行。 一切运行良好,除了udp连接快速消耗内存,并且GC很少收集内存(内存始终在控制台输出1和2之间正好增长65,552字节)。UDP通信快速填充内存

我的客户端代码如下:

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

是否有possibilty内存的心不是增长那么快,喜欢使用缓冲区,而不是?如果没有,可以更迅速地收集未引用的对象“masterEndPoint”和“frame”?

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

任何帮助表示赞赏!

+0

你是说有内存泄漏,或者你有内存使用率尖峰? –

+0

您正在使用同步(阻止)方法来接收消息。改为使用同步事件。请参阅以下网页。这些示例使用套接字,但您可以使用任何继承套接字的类(如udpclient)来替换套接字。 https://msdn.microsoft.com/en-us/library/w89fhyex(v=vs.110).aspx – jdweng

+0

保罗,thx为您的答案。是的,我长期遇到内存泄漏。无论如何,内存的使用量也很大,但它会在一段时间后收集大量的内存(如10 MB左右)。 – user3447279

回答

1

我想我是靠自己解决的。因为我认为总是使用相同的缓冲区而不是新的缓冲区似乎是对的,因为我不再有内存尖峰(从“top”命令释放的内存现在相当稳定!)。

主要方法是:

INT长度= udpClient.Client.ReceiveFrom(缓冲器,参考终点);

我的解决方案如下:

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

如果你有一个更清洁的方式任何建议,请让我知道!

无论如何感谢您的帮助!