Die Garbage Collection von Java mit Zirkelverweisen verstehen
Die Garbage Collection in Java ist dafür verantwortlich, automatisch Speicher freizugeben, der von Objekten belegt wird, die nicht mehr vorhanden sind Verwendung durch alle Live-Referenzen. Während dieser Mechanismus im Allgemeinen unnötigen Speicherverbrauch verhindert, kann es beim Umgang mit Zirkelverweisen zu Herausforderungen kommen.
Beachten Sie den folgenden Code:
class Node { public object value; public Node next; public Node(object o, Node n) { value = o; next = n;} } //...some code { Node a = new Node("a", null), b = new Node("b", a), c = new Node("c", b); a.next = c; } //end of scope //...other code
In diesem Szenario sind die Objekte a, b und c Bilden Sie einen Zirkelbezug (a zeigt auf c, c zeigt auf b und b zeigt auf a). Gemäß den traditionellen Garbage-Collection-Prinzipien sollten diese Objekte als nicht erreichbar markiert werden, da außerhalb des Bereichs, in dem sie erstellt wurden, keine Live-Referenzen vorhanden sind. Sie scheinen jedoch innerhalb der zirkulären Schleife referenziert zu sein.
Java-Lösung für zirkuläre Referenzen
Java's Garbage Collector befasst sich mit zirkulären Referenzen, indem er eine ausgefeiltere Erreichbarkeitsanalyse verwendet. Es nutzt die Idee von „erreichbaren“ und „nicht erreichbaren“ Objekten.
Ein Objekt gilt als erreichbar, wenn es direkt oder indirekt von einem „Garbage-Collection-Stamm“ aus referenziert wird. Zu den Garbage-Collection-Roots gehören globale Variablen, in Thread-Registern gespeicherte Referenzen und von der JVM selbst gehaltene Referenzen.
Im gegebenen Beispiel sind die Objekte a, b und c zunächst erreichbar, wenn sie innerhalb des Bereichs erstellt werden. Sobald jedoch der Gültigkeitsbereich endet (wenn die geschweiften Klammern geschlossen werden), werden alle Verweise auf diese Objekte von außen getrennt. Sie werden vom Garbage-Collection-Stamm aus unerreichbar.
Wiedergewinnung nicht erreichbarer Zirkelverweise
Da a, b und c nun unerreichbar sind, ist der Müll Der Sammler kann sie als potenziellen Müll identifizieren. Es löst einen Mark-and-Sweep-Vorgang aus, bei dem:
Auf diese Weise unterbricht der Java-Garbage Collector den zirkulären Referenzzyklus und gibt den von a, b und c belegten Speicher frei, auch wenn sie jeweils auf sie verweisen andere.
Das obige ist der detaillierte Inhalt vonWie geht Javas Garbage Collector mit Zirkelverweisen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!