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

时间:2016-06-24 04:31:26

标签: c# .net windows memory-leaks netmq

环境

  • 生产中的操作系统:Windows XP SP3
  • IDE:Microsoft Visual Studio 2013 Ultimate Edition
  • 目标框架:.NET framework 3.5
  • NetMQ:3.3.1
  • AsyncIO:0.1.18
  • 语言:C#

我们需要在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);
            }                
        } 
    }
}

Memory Profile of client application

1 个答案:

答案 0 :(得分:1)

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

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