AsyncIO.ForceDotNet.Force() 在 Windows XP 上导致内存泄漏
AsyncIO.ForceDotNet.Force() causes memory leak on Windows XP
环境
- OS 正式版:Windows XP SP3
- IDE:微软Visual Studio2013终极版
- 目标框架:.NET Framework 3.5
- NetMQ:3.3.1
- 异步IO:0.1.18
- 语言:C#
我们需要 运行 在 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);
}
}
}
}
刚刚推送到 AsyncIO,检查一下,如果它解决了你的问题,我会发布一个新版本到 nuget。
https://github.com/somdoron/AsyncIO/commit/b7100a54ec55d3b3fdb9334d1f46a2ec5a070c0a
环境
- OS 正式版:Windows XP SP3
- IDE:微软Visual Studio2013终极版
- 目标框架:.NET Framework 3.5
- NetMQ:3.3.1
- 异步IO:0.1.18
- 语言:C#
我们需要 运行 在 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);
}
}
}
}
刚刚推送到 AsyncIO,检查一下,如果它解决了你的问题,我会发布一个新版本到 nuget。
https://github.com/somdoron/AsyncIO/commit/b7100a54ec55d3b3fdb9334d1f46a2ec5a070c0a