.Net内存在创建大量线程时泄漏

Csh*_*ser 8 .net c# multithreading memory-leaks memory-management

我有一个应用程序,随着时间的推移创建了很多线程.我注意到内存使用量在运行时会增加并最终耗尽内存.但是同样的代码不会泄漏我同事环境中的内存.我们都有相同的.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);               
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的内容时,会打印以下内容

Version 4.0.30319.18063
32
Run Code Online (Sandbox Code Playgroud)

在Visual Studio 2012中,项目的目标框架是.net framework 4.5.项目使用以下配置泄漏内存

Project Properties -> Build
    Platform target: Any CPU
    Prefer 32-bit: checked
Run Code Online (Sandbox Code Playgroud)

如果我取消选中Prefer 32-bit,它不会泄漏.

泄漏内存的另一种配置是

Project Properties -> Build
    Platform target: x86
    Prefer 32-bit: disabled
Run Code Online (Sandbox Code Playgroud)

由此产生的可执行文件泄露在我的笔记本电脑上并没有泄漏在我的同事的笔记本电脑上.

我使用CLR Profiler来查找内存泄漏,但它没有显示任何泄漏.但我确实看到Windows资源监视器中的工作集增加了大约1 MB /秒.

是什么导致我的环境中的32位模式的内存使用量增加,而不是我的同事?

Lau*_*nne -2

您应该限制同时运行的并发线程数,也许您可​​以使用线程池,这样您就可以对添加的且超过您定义的池大小的线程进行排队。

https://msdn.microsoft.com/en-us/library/h4732ks0.aspx