【问题标题】:Memory leak when threads created, GC not effective线程创建时内存泄漏,GC无效
【发布时间】:2017-12-06 00:04:36
【问题描述】:

我的应用程序(用 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 目标似乎可以解决测试应用程序中的问题。不幸的是,我的真实项目包含无法重建的第 3 方子项目。

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

【问题讨论】:

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


    【解决方案1】:

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

    我的应用程序再次运行,但 PC 没有保护。 而且,没有解释,也没有教训可学。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 2014-10-29
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多