AsyncIO.ForceDotNet.Force() 在 Windows XP 上导致内存泄漏

AsyncIO.ForceDotNet.Force() causes memory leak on Windows XP

环境

我们需要 运行 在 Windows XP SP3 上使用简单的 REQ REP 套接字的 NetMQ 应用程序。我们从 Issue #412 了解到,当 运行ning 在 Windows XP 上时,我们需要调用 AsyncIO.ForceDotNet.Force();在使用 NetMQ 之前。

我们在启动应用程序 运行 一段时间(约 3 分钟)后发现的内容,因为我们每秒发送大量消息(每 5 毫秒 1 条消息或每秒 12,000 条消息) ,我们看到内存泄漏的速度约为 3MB/秒。我们的生产机器只有 1 GB 的 RAM,很快就会导致我们的应用程序崩溃。

下面的代码很好地重现了泄漏。要查看泄漏,您可以在任何 Windows OS(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);
            }                
        } 
    }
}

Memory Profile of client application

刚刚推送到 AsyncIO,检查一下,如果它解决了你的问题,我会发布一个新版本到 nuget。

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