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

时间:2015-04-16 19:21:18

标签: c# .net multithreading memory-management memory-leaks

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

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

泄漏内存的另一种配置是

Project Properties -> Build
    Platform target: x86
    Prefer 32-bit: disabled

我的笔记本电脑上泄漏的最终可执行文件不会在我的同事的笔记本电脑上泄漏。

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

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

2 个答案:

答案 0 :(得分:0)

我已阅读所有评论,并担心我的评论会在那里丢失,所以请尝试回答。

使用专为.NET应用程序设计的内存分析器,JetBrains dotMemory或ANTS或WinDBG或任务管理器或其他本机内存工具。

您可以使用所选探查器的实时图表来比较应用在您和您同事的笔记本电脑上的行为方式。 我想你会发现你的笔记本电脑上的内存使用量不断增加 - 只需获取一个内存快照,看看内存中有多少Thread对象,哪些对象占用了大部分内存,并调查它们为什么以及由谁保存在内存中。

答案 1 :(得分:-2)

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

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