2013-05-16 6 views
6

Nimmt sich Ich habe 2 Objekte - Objekt A und Objekt B Objekt A Objektreferenzen B und Objekt B Referenzen A. AUFGABEGarbage collection mit kreisförmigem referenzierte Objekt

  1. Wenn sowohl ein & Objekt B Objekt ist aus Verweis auf den Code - wie Garbage Collector weiß, dass es gesammelt werden kann.
  2. Wie leitet der Garbage Collector ab, dass ein Objekt außerhalb des Geltungsbereichs/bereit für die Garbage Collection ist?
  3. Was ist, wenn Objekt A nicht durch unseren Code ref, aber immer noch unabhängig sein kann. Z.B. Wenn es sich um eine Form-Klasse handelt, kann sie eigenständig ausgeführt werden, selbst wenn Objekt A auf eine neue Instanz oder Null zurückgesetzt wird.
+1

Sie sollten dies lesen: http://msdn.microsoft.com/en-us/library/ee787088.aspx Es beantwortet Ihre Fragen und mehr. (Grob: Der GC hat eine Liste von Dingen, von denen er weiß, dass sie lebendig sind (statische Referenzen, Stapelvariablen, etc.), die "Wurzeln" sind. Jedes andere Objekt, das durch das Verfolgen von Referenzen an diesen Wurzeln erreicht werden kann, wird ebenfalls als lebendig betrachtet Objekt, das * kann nicht * gilt für die Sammlung.) – dlev

+0

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+1

Wenn Sie an solchen Sachen interessiert sind, ist das absolut beste Buch (IMO) [CLR Via C#] (http://www.amazon.co.uk/CLR-Via-Edition-Entwickler-Referenz/dp/0735667454/ref = dp_ob_title_bk) (das ist in seiner 4. Ausgabe und hat einen neu aktualisierten Abschnitt über den Garbage Collector). Ich kann es nicht genug empfehlen. Es erklärt wirklich sehr gut, was gerade in der CLR passiert. –

Antwort

6
  1. Der GC kein Objekt auswählen und wenn etwas Referenzen zu sehen suchen, um es; halte es wenn es so ist. Der GC hat eine Sammlung von jedem Objekt, von dem es weiß, dass es "lebt". Diese Auflistung beginnt als alle statischen Variablen, alle Variablen auf dem Stapel und einige andere Sonderfälle. Sie durchläuft dann jedes dieser "lebenden" Objekte und sieht, auf welche Objekte sie verweisen. Jedes referenzierte Objekt wird selbst als "lebendig" markiert, da es bedeutet, dass es von einem anderen lebenden Objekt erreichbar ist. Es wiederholt diesen Prozess, bis keine neuen Objekte mehr gefunden werden. Alles, was nicht als lebendig markiert wurde, ist dann als unerreichbar bekannt. Wie Sie sehen können, ist es nicht relevant, ob ein "totes" Objekt referenziert wurde oder nicht.

  2. Siehe # 1.

  3. Nun, in den meisten dieser Fälle ist es irgendwo tatsächlich referenziert; Im Falle eines Formulars haben Sie beispielsweise Application.OpenForms, die auf alle geöffneten Formulare verweisen. Für solche Objekte existieren oft ähnliche Konstrukte. In seltenen Fällen mit Objekten wie Timern werden sie vom GC ausdrücklich dazu aufgefordert, nicht gesammelt zu werden. Solche Situationen sind sehr selten und Sie müssen im Allgemeinen nicht über sie sorgen.

0
  1. Der Garbage Collector schaut durch die aktiven Referenzen, und alles, was gesammelt werden kann, ist nicht von dort zu finden. Auf diese Weise ist es nicht wichtig, dass die beiden Objekte sich gegenseitig referenzieren, da beide Referenzen inaktiv sind.

  2. Siehe 1.

  3. Eine Form ist eine Komponente, so dass es als ein, indem sie registriert am Leben gehalten wird. Nach der Initialisierung hält die Anwendung selbst am Leben, bis das Formular entsorgt wird. Wenn Sie eine Variable verwenden, die auf das Formular verweist und dann die Variable auf null setzt, wird nur der Verweis geändert, und das Objekt selbst wird nicht bearbeitet.