环境
- 生产中的操作系统:Windows XP SP3
- IDE:Microsoft Visual Studio 2013 终极版
- 目标框架:.NET 框架 3.5
- 网络MQ:3.3.1
- 异步IO:0.1.18
- 语言:C#
我们需要在 Windows XP SP3 上使用简单的 REQ REP 套接字运行 NetMQ 应用程序。我们从 Issue #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);
}
}
}
}