环境
我们需要在Windows XP SP3上使用简单的REQ REP套接字运行NetMQ应用程序。我们从问题#412中了解到,在Windows XP上运行时,我们需要调用AsyncIO.ForceDotNet.Force();在使用NetMQ之前。
我们开始运行应用程序一段时间(~3分钟)之后发现,因为我们每秒发送大量消息(每5毫秒1条消息或每秒12,000条消息),我们看到内存泄漏速率~3MB /秒。我们的生产机器只有1 GB的RAM,很快就会导致我们的应用程序崩溃。
下面的代码很好地再现了泄漏。要查看泄漏,您可以在任何Windows操作系统(7,8或10)上运行它; Windows XP SP3不是必需的(但没有AsyncIO.ForceDotNet.Force(),NetMQ无法在Windows XP SP3上运行。)
客户端代码(阻止我们在生产中部署应用程序的有问题的代码)
class Client
{
static void Main(string[] args)
{
AsyncIO.ForceDotNet.Force();
while (true)
{
using (RequestSocket request = new RequestSocket())
{
request.Connect("tcp://127.0.0.1:5555");
request.SendFrame("Hello");
byte[] recData;
bool result = request.TryReceiveFrameBytes(TimeSpan.FromSeconds(1), out recData);
if (result)
Console.WriteLine(string.Format("Reply From Server:{0}", System.Text.Encoding.Default.GetString(recData)));
System.Threading.Thread.Sleep(5);
}
}
}
}
相应的服务器代码(也泄漏)
class Server
{
static void Main(string[] args)
{
AsyncIO.ForceDotNet.Force();
using (ResponseSocket response = new ResponseSocket())
{
response.Bind("tcp://127.0.0.1:5555");
while (true)
{
byte[] recData = response.ReceiveFrameBytes();
Console.WriteLine(string.Format("Reply From Server:{0}", System.Text.Encoding.Default.GetString(recData)));
response.SendFrame("World");
System.Threading.Thread.Sleep(1);
}
}
}
}
答案 0 :(得分:1)
刚刚推送到AsyncIO,检查出来,如果它解决了你的问题,我将发布一个新版本到nuget。
https://github.com/somdoron/AsyncIO/commit/b7100a54ec55d3b3fdb9334d1f46a2ec5a070c0a