我有一个应用程序,随着时间的推移创建了很多线程。我注意到随着它的运行,内存使用量会增加,并最终耗尽内存。但是,在我同事的环境中,相同的代码不会泄漏内存。我们两个都有相同的.net版本。我能够使用以下示例代码重现此问题,但这在我同事的笔记本电脑上不会泄漏。
public static void Main(string[] args)
{
Console.WriteLine("Version " + Environment.Version.ToString());
if (Environment.Is64BitProcess)
Console.WriteLine("64");
else
Console.WriteLine("32");
while(true)
{
Thread t = new Thread(() => { Thread.Sleep(1); });
t.IsBackground = true;
t.Start();
Thread.Sleep(1);
}
}
当我运行以上代码时,它会打印出以下内容。
Version 4.0.30319.18063
32
在Visual Studio 2012中,项目的目标框架是.NET Framework 4.5。 该项目在以下配置下泄露内存。
Project Properties -> Build
Platform target: Any CPU
Prefer 32-bit: checked
如果我取消勾选“偏好32位”,它就不会泄漏。
另一个泄露内存的配置是:
Project Properties -> Build
Platform target: x86
Prefer 32-bit: disabled
我的笔记本电脑上泄漏的可执行文件在我的同事的笔记本电脑上没有泄漏。
我使用CLR Profiler查找内存泄漏,但它没有显示任何泄漏的内容。但我看到在Windows资源监视器中工作集每秒增加大约1 MB。
是什么导致32位模式下我的环境中的内存使用量增加,但我的同事的环境中没有?