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 killun système d'exploitation, vous demanderez poliment de mettre fin aux processus. Lorsque le processus reste cependant actif, on peut utiliser kill -9là où le système d'exploitation supprime tout contrôle.
Lorsque j'ai exécuté votre code dans l' csharpenvironnement 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 stdoutest bloqué par le termintation de l'environnement.
Lors de la suppression Console.WriteLineet 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).