Почему один цикл вызывает утечку памяти? - PullRequest
4 голосов
/ 27 марта 2012

Я сталкиваюсь с очень странным поведением.С этим фиктивным кодом:

 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

Как это возможно?

Iдумал, что GC позаботится об этих вещах.

Более того, если я сравню поведение этой памяти с версией, в которой я запускаю сбор GC каждые 10 итераций, результат (для меня) удивителен:

enter image description here

Зеленый процесс - это процесс без GC.COllect (), а черный - другой.

Не могли бы вы помочь мне разобраться в проблеме?

Спасибо!

Ответы [ 7 ]

9 голосов
/ 27 марта 2012

Вы создаете кучу строк.GC пока не счел нужным собирать их.В конце концов график памяти будет плато.GC работает нормально - здесь нет проблем:)

4 голосов
/ 27 марта 2012

GC не убирает память сразу. Это было бы очень неэффективно.

1 голос
/ 27 марта 2012

Нет утечки.Удалите нить. Спите (40);и подождите дольше, GC должен включиться через некоторое время.

1 голос
/ 27 марта 2012

Используйте StringBuilder вместо String и посмотрите, не решит ли это вашу проблему.

0 голосов
/ 14 мая 2013

если вы определили жиро из цикла это решит вашу проблему

 String giro;

  while ( true )
    {
        i++;

        giro = "iteration " + i;

        Console.WriteLine(giro);

        Thread.Sleep(40);
    }
0 голосов
/ 28 марта 2012

Если вам нужен сборщик мусора, вы можете назвать его:

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

... это очень дорого, хотя ...

0 голосов
/ 27 марта 2012

Попробуйте изменить это:

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

до

Console.WriteLine("iteration " + i);
...