【问题标题】:C# continue/break leaking memoryC# 继续/中断泄漏内存
【发布时间】:2017-10-20 20:51:31
【问题描述】:

假设我想在多个线程上执行一些命令。我会有这个示例代码:

for (int i = 0; i < 5000; i++)
        {
            new Thread(() =>
            {
                while (true)
                {
                    string foo = "foo " + DateTime.Now.Ticks;

                    bool breakout = false;

                    for (int j = 0; j < random.Next(10, 100); j++)
                    {
                        string bar = "bar " + DateTime.Now.Ticks;
                        if (j == 5)
                        {
                            continue;
                        }
                        if (j == 8)
                        {
                            breakout = true;
                            break;
                        }
                    }

                    if (breakout)
                    {
                        continue;
                    }

                    string baz = "baz " + DateTime.Now.Ticks;
                }
            }).Start();
        }

这个代码示例,创建 5K 线程并设置一些字符串,就我而言,内存泄漏。随着代码的运行,内存使用率越来越高。 现在,我认为这是因为我正在设置变量然后放弃它们 - 有没有办法可以继续/中断而不会越来越多地增加内存使用量?

【问题讨论】:

  • 您正在创建 5000 个永不终止的线程。您正在泄漏内存。
  • 您的标题似乎“责备”中断/继续。您不认为“运行 5000 个线程不断创建新字符串”的可能性更大吗? (我的猜测是你的 CPU 被严重固定,以至于 GC 没有机会运行。)
  • 不需要if (j == 5) continue; 部分,因为无论如何都不会运行其他代码 - 无论如何循环都会继续。
  • 您生成了 5000 个线程,每个线程在一个紧密的、永无止境的循环中生成 11 到 101 个 22 字符的字符串。也许您的意思是在 if (breakout) 块中使用 break 而不是 continue
  • @rufus-l 字符串不应该被 GC 丢弃吗?

标签: c# loops memory-leaks


【解决方案1】:

这是一个经典的issue,在带有“+”字符的循环内连接字符串。而是在循环中使用 StringBuilder 组合字符串。

【讨论】:

  • 字符串连接(特别是)似乎没有任何会泄漏内存的问题。所有的字符串只分配一次,并且它们在每次迭代时都超出范围(因此成为 GC 的候选者)。可能更有可能只是字符串的连续创建在它们被收集之前就已经填满了内存。
  • 可能,但另一个问题是垃圾收集时间是保证还是瞬时
  • 每次迭代连接一个字符串的无限循环肯定会导致无限的内存消耗。但是切换到StringBuilder 并不能解决这个问题。您提到的“经典问题”涉及 速度 性能,而不是内存性能,因为字符串连接不如使用StringBuilder 高效。两者最终都会导致相同的内存消耗。在任何情况下,OP 都不会重复连接相同的字符串,因此甚至不会遇到字符串连接导致的速度性能问题。
猜你喜欢
  • 2011-10-04
  • 2020-06-23
  • 2016-01-27
  • 2010-11-11
  • 2017-02-18
  • 1970-01-01
  • 2011-01-13
  • 2018-10-24
  • 2012-10-09
相关资源
最近更新 更多