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);
}
...
}
如果您对更简洁的方法有任何建议,请告诉我!
谢谢你的帮助!
我在一个小型 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);
}
...
}
如果您对更简洁的方法有任何建议,请告诉我!
谢谢你的帮助!