Un garbage collector n'est pas un système actif. Il s'exécute «parfois» et principalement à la demande (par exemple lorsque toutes les pages proposées par l'OS sont pleines).
La plupart des garbage collector s'exécutent à la manière de la première génération dans un sous-thread. Dans la plupart des cas, le recyclage de l'objet peut prendre des heures.
Le seul problème se produit lorsque vous souhaitez mettre fin au programme. Cependant, ce n'est pas vraiment un problème. Lorsque vous utilisez kill
un système d'exploitation, vous demanderez poliment de mettre fin aux processus. Lorsque le processus reste cependant actif, on peut utiliser kill -9
là où le système d'exploitation supprime tout contrôle.
Lorsque j'ai exécuté votre code dans l' csharp
environnement interactif , j'ai:
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
Ainsi , votre programme se bloque à cause stdout
est bloqué par le termintation de l'environnement.
Lors de la suppression Console.WriteLine
et de la suppression du programme. Au bout de cinq secondes, le programme se termine (en d'autres termes, le ramasse-miettes abandonne et libère simplement toute la mémoire sans prendre en compte les finaliseurs).