Debugging und der .NET -Müllsammler: Unerwartete frühe Finalisierung
Der .NET -Müllsammler (GC) schließt typischerweise Objekte ab, wenn sie nicht mehr verwiesen werden. Debugging kann jedoch eine unerwartete frühe Finalisierung einführen. Untersuchen wir dieses Verhalten:
Betrachten Sie diesen Code -Snippet:
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 } }
Wir gehen davon aus, dass Class1.c
0 drucken kann. Das c1
-Objekt sollte nach dem Verlassen des Geltungsbereichs fertiggestellt werden. Während des Debuggens druckt es jedoch manchmal 1 aus, was vor der vorzeitigen Finalisation vor GC.Collect()
.
Der Einfluss des Debuggers
Diese Anomalie beruht auf der Wechselwirkung zwischen dem Debugger und dem Just-in-Time-Compiler (JIT). Der JIT -Compiler optimiert typischerweise den Code in Release -Builds und verfolgt die Lebenszyklen der Objekte genau. Debugger deaktivieren diese Optimierungen jedoch häufig für verbesserte Debugging -Fähigkeiten. Dies wirkt sich aus
c1
c1
Auflösen des Problems
Um dies zu korrigieren, führen Sie den Code im Release -Modus aus. Passen Sie alternativ die Einstellungen des Debugger an, um die JIT -Optimierung zu ermöglichen. Dies gewährleistet ein genaues GC -Verhalten.
Zusätzliche Punkte
c1
ist im Freigabemodus aufgrund der JIT -Optimierung unwirksam. null
GC.KeepAlive()
Das obige ist der detaillierte Inhalt vonWarum schließt mein .NET -Müllsammler früh beim Debuggen Objekte ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!