2013-05-09 4 views
0

Я создаю программу, которая будет проверять список каталогов каждые 2 секунды. Я ожидаю, что эта программа будет работать в течение нескольких месяцев без утечки памяти или для каких-либо человеческих взаимодействий.C# Таймер и утечка памяти

  1. Внизу программа имеет утечку памяти.

  2. Я все еще не уверен, что представляет собой 10K. Это не интервал. Интервал равен 2k.


class Program 
{ 
    static void Main(string[] args) 
    { 
     Timer aTimer = new Timer(10000); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     aTimer.Interval = 2000; 
     aTimer.Enabled = true; 
     Console.WriteLine("Press the Enter key to exit the program."); 
     Console.ReadLine(); 
     GC.KeepAlive(aTimer); 
    } 

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); 

     string[] DirList = Directory.GetFiles(@"C:\TTImer"); 
     if (DirList.Length > 0) 
     { 
      foreach (string s in DirList) 
      { 
       //do something 
      } 
     } 
    } 
} 
+1

C# сборщик мусора, как именно у вас есть утечка памяти? – evanmcdonnal

+0

Итак: 1. Где доказательство имеет утечку памяти. 2. Что «что-то делать», потому что утечка почти наверняка будет там. –

+0

каждые 2 секунды или около того увеличивается использование памяти –

ответ

4
  1. Нет, нет утечки памяти, то есть ожидаемое поведение программы в LANGAUGE, который использует сборщик мусора. Память будет увеличиваться, пока в конце концов она не достигнет точки, где сборщик мусора очищает любые ненужные объекты.

  2. Это место, где можно указать интервал таймера. Вы перезаписываете его позже, так что это ничего не делает.

+0

Я помещаю сбор мусора в правильное место? –

+1

@JohnRyann Вы не «размещаете сбор мусора» в любом месте. Вы никогда не делаете ничего, чтобы запускать сборку мусора, и вам никогда не понадобится. Он будет работать полностью на собственном, когда он сочтет это уместным, и вы можете чувствовать себя уверенно, что он будет знать лучше вас. – Servy

+0

GC.KeepAlive (aTimer); –

1
  1. Я буду считать, что вы считаете, что есть утечки потому, что ваш менеджер задач использование мем идет вверх (что вполне нормально). Диспетчер виртуальной памяти ленив и ничего не заменит, если это необходимо. Ваш GC очистит все, как только будет достигнут порог.

  2. Значение 10000 - это заданный интервал таймера в миллисекундах. Как указывает Servy, вы переписываете его позже, так что вы ничего не делаете, кроме как, возможно, избавляетесь от предупреждений при создании проекта (например, неинсталлированный объект).

0

Если один был выставлен счет за каждую секунду, что мегабайт памяти использовался без необходимости, то это может иметь смысл беспокоиться о том, что бесполезные объекты могут выжить довольно долго, не будучи сборщиком мусора. На практике, однако, освобождение памяти, выделенной бесполезно, не будет иметь никакого эффекта, если или пока не будет какая-то другая цель, к которой в противном случае могла бы быть помещена эта память. Типичный сборщик мусора можно рассматривать как процесс, который проходит через здание, находит все значение и перемещает его в другое здание, а затем динамизирует первое здание и создает новый пустой. Стоимость этой операции будет зависеть в основном от количества вещей, которые необходимо сохранить, и будет в значительной степени независима от количества мусора, который уничтожается. Таким образом, если есть еще что-то полезное для памяти, стоимость на мегабайт мусора будет сведена к минимуму, если много мусора разрешено накапливать до того, как оно будет уничтожено оптом. По разным причинам, даже если в системе была только одна программа, и у нее было четыре гигабайта памяти для ее запуска, обычно было бы целесообразно выполнять циклы сбора мусора до того, как накопилось множество концертов мусора, но если они не будут другие вещи, которые должны использовать память, чрезмерно агрессивная сборка мусора будет ухудшать, а не повышать эффективность.