Um coletor de lixo não é um sistema ativo. Ele funciona "às vezes" e principalmente sob demanda (por exemplo, quando todas as páginas oferecidas pelo sistema operacional estão cheias).
A maioria dos coletores de lixo é executada de maneira semelhante à da primeira geração em um subtread. Na maioria dos casos, pode levar horas até que o objeto seja reciclado.
O único problema ocorre quando você deseja encerrar o programa. No entanto, isso não é realmente um problema. Quando você usa kill
um sistema operacional irá pedir educadamente para encerrar processos. Quando o processo, no entanto, permanece ativo, pode-se usarkill -9
onde o sistema operacional remove todo o controle.
Quando executei seu código no csharp
ambiente interativo , obtive:
csharp>
1
2
Unhandled Exception:
System.NotSupportedException: Stream does not support writing
at System.IO.FileStream.Write (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0
at System.IO.StreamWriter.FlushBytes () [0x00000] in <filename unknown>:0
at System.IO.StreamWriter.FlushCore () [0x00000] in <filename unknown>:0
at System.IO.StreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0
at System.IO.CStreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0
at System.IO.CStreamWriter.Write (System.Char[] val) [0x00000] in <filename unknown>:0
at System.IO.CStreamWriter.Write (System.String val) [0x00000] in <filename unknown>:0
at System.IO.TextWriter.Write (Int32 value) [0x00000] in <filename unknown>:0
at System.IO.TextWriter.WriteLine (Int32 value) [0x00000] in <filename unknown>:0
at System.IO.SynchronizedWriter.WriteLine (Int32 value) [0x00000] in <filename unknown>:0
at System.Console.WriteLine (Int32 value) [0x00000] in <filename unknown>:0
at P.Finalize () [0x00000] in <filename unknown>:0
Portanto, seu programa trava porque stdout
está bloqueado pela terminação do ambiente.
Ao remover Console.WriteLine
e matar o programa. Depois de cinco segundos, o programa termina (em outras palavras, o coletor de lixo desiste e simplesmente vai liberar toda a memória sem levar os finalizadores em consideração).