创建线程时内存泄漏,GC无效

时间:2017-07-02 17:24:10

标签: c# .net multithreading memory-leaks garbage-collection

我的应用程序(用C#编写)在过去的几个月里没问题,但上周突然开始导致内存泄漏。我没有重建它,二进制文件是一样的!

虽然试图找出根本原因是什么,但我最终得到了后来在Thread memory leak中找到的相同的测试应用程序。所以我简单地复制了Hans提出的解决方案并启动了它。内存泄漏持续存在。添加GC.Collect()只会导致内存增长变得锯齿状,因为GC在每次调用中都恢复了分配内存的一小部分。

使用分析器检查,除了与线程相关的内容之外,所有其他托管或非托管对象都已正确完成。

class Program
{
    static void test()
    {
    }

    static void Main(string[] args)
    {
        int cnt = 0;
        while (true)
        {              
            Thread test_thread = new Thread(() => test());
            test_thread.Start();
            if (++cnt % 256 == 0) GC.Collect();
            Thread.Sleep(20);
        }
    }
}

然后我在另一台PC上尝试了相同的测试代码,并且(出乎意料!)它工作正常,并且根本没有内存泄漏。

更新:受此主题的启发 .Net Memory Leak when creating lots of threads 我试图为不同的目标建立。使用x64 target似乎解决了测试应用程序中的问题。不幸的是,我的真实项目包含一个无法重建的第三方子项目。

看来,我的电脑出了问题,导致GC无法正常工作。你能建议,检查什么,在哪里看?提前谢谢。

1 个答案:

答案 0 :(得分:1)

.Net Memory Leak when creating lots of threads的评论中有解决方案。我检查了Windows安全模式下没有泄漏。然后在正常模式下,我开始杀死非重要的进程。正如Hans Passant所建议的那样,防病毒过程就可以解决问题。谢谢!

我的应用程序再次运行,但PC没有保护。 此外,没有任何解释,也没有需要学习的经验教训。