Maison >développement back-end >C++ >Pourquoi mon collecteur de déchets .net finalise-t-il les objets tôt lors du débogage?
Débogage et collecteur de déchets .NET: finalisation précoce inattendue
Le collecteur de déchets .NET (GC) finalise généralement les objets lorsqu'ils ne sont plus référencés. Cependant, le débogage peut introduire une finalisation précoce inattendue. Examinons ce comportement:
Considérez cet extrait de code:
<code class="language-csharp">public class Class1 { public static int c; ~Class1() { c++; } } public class Class2 { public static void Main() { { var c1 = new Class1(); } GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(Class1.c); // Might print 0 or 1 } }</code>
Nous prévoyons que Class1.c
imprimer 0. L'objet c1
doit être finalisé après avoir quitté sa portée. Pourtant, pendant le débogage, il imprime parfois 1, indiquant une finalisation prématurée avant GC.Collect()
.
L'influence du débogueur
Cette anomalie découle de l'interaction entre le débogueur et le compilateur juste en temps (JIT). Le compilateur JIT optimise généralement le code dans les builds de version, suivant avec précision les cycles de vie d'objets. Cependant, les débuggeurs désactivent souvent ces optimisations pour améliorer les capacités de débogage. Cela a un impact sur la façon dont le GC gère la finalisation des objets:
c1
le synchronisation de la durée de vie et de la finalisation de c1
, provoquant potentiellement le finaliseur plus tôt que prévu. Résolution du problème
Pour rectifier cela, exécutez le code en mode version. Alternativement, ajustez les paramètres du débogueur pour permettre l'optimisation du JIT. Cela garantit un comportement GC précis.
Points supplémentaires
c1
à null
est inefficace en mode de libération en raison de l'optimisation JIT. GC.KeepAlive()
peut contrôler explicitement les durées de vie des objets. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!