【问题标题】:Why does a single loop cause a memory leak?为什么单个循环会导致内存泄漏?
【发布时间】:2012-04-10 20:13:57
【问题描述】:

我正面临一种非常奇怪的行为。 使用这个虚拟代码:

 static void Main( string[] args )
    {
        int i = 0;

        while ( true )
        {
            i++;

            String giro = "iteration " + i;

            Console.WriteLine(giro);

            Thread.Sleep(40);
        }
    }

使用 perfom 私有字节正在增加。

img http://dl.dropbox.com/u/2478017/memory.gif

这怎么可能?

我认为 GC 会处理这些事情。

此外,如果我将它的内存行为与我每 10 次迭代强制 GC 收集的版本进行比较,结果(对我来说)令人惊讶:

绿色进程是没有 GC.COllect() 的进程,黑色进程是另一个进程。

你能帮我理解这个问题吗?

谢谢!

【问题讨论】:

  • 从 9.5 到 11 MB?你担心那个?它最终会被清理干净,别担心。
  • 问题是内存从 2 小时开始就是这样运行的......
  • @ff8mania:那只是因为你的程序很慢,大部分时间都在睡觉。
  • 你是对的。但是有人可以解释一下为什么强制 GC 的版本总是平坦的?
  • 它是扁平的,因为它总是被收集,因为你强制 GC。

标签: c# .net memory-management garbage-collection


【解决方案1】:

您正在创建一堆字符串。 GC 还认为不适合收集它们。最终,内存图将趋于平稳。 GC 工作正常 - 这里没有问题 :)

【讨论】:

    【解决方案2】:

    GC 不会立即清理内存。那将是非常低效的。

    【讨论】:

      【解决方案3】:

      使用 StringBuilder 代替 String 看看是否不能解决您的问题。

      【讨论】:

        【解决方案4】:

        没有泄漏。删除 Thread.Sleep(40);再等一会,GC 应该会在一段时间后启动。

        【讨论】:

        • 你能更好地解释一下你的回复吗?为什么睡眠会影响 GC?
        • @ff8mania :我说删除 sleep 以更快地创建 String 对象,以更快地查看它对内存的影响。通过这种方式,您可以查看它是无限期地填充内存(真正的泄漏)还是只是 VM 或 GC 行为的产物。我认为你的程序没有泄漏任何东西。
        • 精确。它会停滞不前。不是真正的泄漏。
        【解决方案5】:

        尝试改变这个:

        String giro = "iteration " + i;
        Console.WriteLine(giro);
        

        Console.WriteLine("iteration " + i);
        

        【讨论】:

          【解决方案6】:

          如果你需要垃圾收集器,你可以调用它:

                                  GC.Collect();
                                  GC.WaitForPendingFinalizers();
          

          ...虽然很贵...

          【讨论】:

            【解决方案7】:

            如果你定义为 giro out of loop 它会解决你的问题

             String giro;
            
              while ( true )
                {
                    i++;
            
                    giro = "iteration " + i;
            
                    Console.WriteLine(giro);
            
                    Thread.Sleep(40);
                }
            

            【讨论】:

              猜你喜欢
              • 2016-01-02
              • 2013-07-12
              • 1970-01-01
              • 2017-02-13
              • 1970-01-01
              • 1970-01-01
              • 2022-01-03
              • 1970-01-01
              相关资源
              最近更新 更多