2012-03-27 2 views
4

Я столкнулся с очень странным поведением. С этим фиктивным кодом:Почему один цикл вызывает утечку памяти?

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 позаботится об этих вещах.

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

enter image description here

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

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

Спасибо!

+1

От 9,5 до 11 МБ? Вы беспокоитесь об этом? В конце концов, он будет очищен, не волнуйтесь. – Botz3000

+0

Проблема в том, что память ведет себя таким образом с 2 часов .... – ff8mania

+0

@ ff8mania: Это просто потому, что ваша программа очень медленная, большую часть времени спать. –

ответ

9

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

4

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

1

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

1

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

+0

Не могли бы вы объяснить мне лучше ваш ответ? Почему сон влияет на GC? – ff8mania

+1

@ ff8mania: Я сказал, что удалить сон, чтобы быстрее создавать объекты String, чтобы быстрее увидеть эффект от него в памяти. Таким образом, вы можете увидеть, постоянно ли заполняется память (настоящая утечка) или просто артефакт поведения VM или GC. Я не думаю, что ваша программа просачивается. – mdakin

+0

Exactlu.Это будет плато. Это не настоящая утечка. – ff8mania

0

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

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

в

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

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

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

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

0

, если вы определили giro out цикла он решит вашу проблему

String giro; 

    while (true) 
    { 
     i++; 

     giro = "iteration " + i; 

     Console.WriteLine(giro); 

     Thread.Sleep(40); 
    } 
Смежные вопросы