1

环境

  • 生产中的操作系统: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);
            }                
        } 
    }
}

客户端应用程序的内存配置文件

4

1 回答 1

1

只需将以下提交推送到 AsyncIO,检查一下,如果它解决了您的问题,我将发布一个新版本到 nuget。

https://github.com/somdoron/AsyncIO/commit/b7100a54ec55d3b3fdb9334d1f46a2ec5a070c0a

于 2016-06-26T14:13:30.213 回答