为什么单个循环会导致内存泄漏?

时间:2012-03-27 09:51:22

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

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

 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收集的版本进行比较,结果是(对我来说)令人惊讶:

enter image description here

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

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

谢谢!

7 个答案:

答案 0 :(得分:9)

你正在创建一堆字符串。 GC还不适合收集它们。最终记忆图将稳定下来。 GC工作正常 - 这里没有问题:)

答案 1 :(得分:4)

GC不会直接整理内存。那将是非常低效的。

答案 2 :(得分:1)

使用StringBuilder而不是String,看看是否无法解决您的问题。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

尝试更改此内容:

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

Console.WriteLine("iteration " + i);

答案 5 :(得分:0)

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

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

......虽然它非常昂贵......

答案 6 :(得分:0)

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

 String giro;

  while ( true )
    {
        i++;

        giro = "iteration " + i;

        Console.WriteLine(giro);

        Thread.Sleep(40);
    }