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

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


我已阅读所有评论,并担心我的评论将会丢失,因此请尝试回答。

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

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


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

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

链接地址: http://www.djcxy.com/p/92033.html

上一篇: .Net Memory Leak when creating lots of threads

下一篇: Create a memory leak in Java 8