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

C# 为什么单个循环会导致内存泄漏?,c#,.net,memory-management,garbage-collection,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);

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

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

        while ( true )
        {
            i++;

            String giro = "iteration " + i;

            Console.WriteLine(giro);

            Thread.Sleep(40);
        }
    }
使用perfom时,专用字节正在增加

怎么可能呢

我以为GC会处理这些东西

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

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

你能帮我理解这个问题吗


谢谢

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

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

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

没有泄漏。移除螺纹。睡眠(40);等待更长时间,GC应该在一段时间后启动。

尝试更改此选项:

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


如果需要垃圾收集器,可以将其称为:

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

…但是它非常昂贵…

如果您定义要跳出循环 它会解决你的问题

 String giro;

  while ( true )
    {
        i++;

        giro = "iteration " + i;

        Console.WriteLine(giro);

        Thread.Sleep(40);
    }

从9.5 MB到11 MB?你担心吗?别担心,它最终会被清理干净的。问题是内存在2小时后就以这种方式运行了。@ff8mania:那只是因为你的程序非常慢,大部分时间都在睡觉。你是对的。但是有人可以解释为什么强制GC的版本总是扁平的?它是扁平的,因为它总是被收集的,因为你强制GC。你能更好地解释你的回答吗?为什么睡眠会影响GC?@ff8mania:我说移除睡眠可以更快地创建字符串对象,从而更快地看到它对内存的影响。通过这种方式,您可以看到它是在无限期地填充内存(真正的泄漏),还是仅仅是VM或GC行为的产物。我认为你的程序不会泄露任何信息。它会变平的。这不是真正的泄密。
 String giro;

  while ( true )
    {
        i++;

        giro = "iteration " + i;

        Console.WriteLine(giro);

        Thread.Sleep(40);
    }