2009-07-19 9 views
0

Wenn ich einen Destruktor in einer Klasse Foo implementiere, werden Instanzen von Foo in der Finalisierungswarteschlange genau verfolgt. Wenn eine Instanz von Foo eine Garbage Collection ist, verstehe ich, dass die CLR den Eintrag in der Finalisierungswarteschlange sieht und diesem Objekt eine besondere Behandlung gewährt, indem sie das Objekt vom Heap und in die final erreichbare Final Table verschiebt. Dann ... passiert nichts mehr für diesen Müllsammelzyklus?Finalisierung erreichbare Tabelle

Wird finalize() immer während des nächsten Speicherbereinigungszyklus aufgerufen?

Warum wird Finalize nicht sofort nach dem Kopieren meines Objekts in die freischaltbare Tabelle aufgerufen? (das scheint eine zusätzliche unnötige Komplexität zu sein)

Antwort

1

Die Finalizer-Warteschlange dient der Vereinfachung; Ohne sie wäre es komplexer. Wenn der GC ausgeführt wird, muss kein verwalteter Code ausgeführt werden. Andernfalls können alle vom GC durchgeführten Analysen ungültig sein, wenn der Benutzercode in der Mitte ausgeführt wird.

Wenn also der GC ausgeführt wird, muss die Finalisierung verzögert werden, anstatt sofort ausgeführt zu werden. Durch das Ausführen in einem separaten Thread wird die Zeit minimiert, für die die VM exklusiven Zugriff auf alle Threads benötigt, und das Potenzial für gleichzeitige Aktivitäten erhöht.

+0

Verstanden. Aber warum löscht der Garbage Collector nicht nur die Finalize() - Threads, wenn er mit dem Zyklus fertig ist? Warum auf den nächsten Zyklus warten? –

+0

Warum glaubst du, dass es das nicht tut? Wenn ein Objekt finalisierbar ist, aber ansonsten nicht erreichbar ist, wird es in die Warteschlange für den Zugriff aufgenommen. Dort wird der Finalizer-Thread ihn sofort nach Beendigung der Garbage-Collection abholen. –

+0

Andrew Troelsen sagte: "An diesem Punkt wird ein separater Thread erzeugt, um die Finalize() -Methode für jedes Objekt in der freachable-Tabelle bei der nächsten Garbage-Collection aufzurufen. Vorausgesetzt, dass es mindestens zwei Garbage-Collections braucht, um ein finalize abzuschließen Objekt "(p191 - Pro C# mit .NET 3.0) –

Verwandte Themen