2016-06-10 3 views
1

Завершает ли сборщик мусора после того, как весь основной метод завершил выполнение или все еще выполняется в фоновом режиме, чтобы очистить все объекты, оставшиеся в памяти в основном методе.Когда сборщик мусора в выводе C#

+1

Финализаторы по-прежнему должны запускаться после выхода main, поэтому он вскоре после завершения всего кода пользователя завершил выполнение GC/framework. Было бы интересно иметь технический, правильный ответ на этот вопрос. – MicroVirus

+0

Приложение обычно заканчивается, когда заканчивается метод Main (и как таковой пункт входа в программу). На этом этапе GC может работать немного, но в конечном итоге операционная система очистит всю выделенную память. – poke

+0

сборщик мусора работает в * отдельном потоке *, поэтому он может быть продолжен, даже если возвращается 'Main' –

ответ

4

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

Вы можете продемонстрировать это со следующей программой:

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace Demo 
{ 
    class Test 
    { 
     ~Test() 
     { 
      Thread.Sleep(250); 
      Trace.WriteLine("In Test finalizer"); 
     } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      var t = new Test[20]; 

      for (int i = 0; i < 20; ++i) 
       t[i] = new Test(); 

      //t = null; 
      //GC.Collect(); 
      //GC.WaitForPendingFinalizers(); 
     } 
    } 
} 

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

Однако, вы можете быть уверены, что все ожидающие финализаторы полностью выполняются в конце программы, вызвав

GC.Collect(); 
GC.WaitForPendingFinalizers() 

Если раскомментировать три закомментированные линий в конце Main() в примере коде выше и снова запустите программу под отладчиком, вы увидите, что будут выполнены все 20 вызовов финализатора Test.

0

Как только процесс завершается, все ресурсы, принадлежащие ему, освобождаются. Это выполняется операционной системой. GC предназначен для управляемого ресурса.

Я предполагаю, что основным является метод точки входа в этом случае, например, в консольном приложении.

+0

Для исполняемых файлов C# main почти всегда является точкой входа, даже если у вас есть формы. – MicroVirus

0

Сборщик мусора (GC) запускается с вашим приложением и выйдет с ним. Во время вашего жизненного цикла приложения он запускается в фоновом режиме для освобождения управляемых ресурсов.

GC генерируется самой картой .net.

+0

Что касается сборщика мусора в отношении основного метода – deshmanth

Смежные вопросы