Ich weiß, dass ein Retain-Zyklus (zumindest in Objective-C und Swift) der Fall ist, wenn zwei Objekte Anspruch auf einander erheben (sie haben Referenzen zueinander). Und in Objective-C können wir das Problem lösen, indem wir eine von ihnen als weak
deklarieren.
Nach dem, was ich gelesen und verstanden habe, ist der Java-GC nicht von Aufbewahrungszyklen betroffen, und wir müssen uns nicht um weak
-Referenzen kümmern. Wie löst es das?
Der Java-Garbage Collector sucht nach "erreichbaren" Objekten - von den Root (s). Wenn sie nicht erreicht werden können (wenn sie keine externen Objektreferenzen haben), können ganze Objektgraphen verworfen werden.
Im Wesentlichen durchquert es einfach den Baum von Wurzel (n) zu Blattknoten und markiert alle Objekte, auf die es trifft. Jeder Speicher, der nicht von markierten Objekten im Heap belegt ist, wird gesweept (als frei markiert). Dies nennt man markieren und fegen . img src
Dies ist in objective-c weil es Referenzzählung verwendet, nicht markieren und fegen, was hat seine Fehler
Der Grund, warum es keine Aufbewahrungszyklen geben kann, liegt darin, dass sie nicht markiert sind und verworfen werden können, wenn sie nicht irgendwo mit dem "Baum" verbunden sind.
Der Garbage Collector sucht ausgehend von den Roots nach erreichbaren Objekten (normalerweise: Variablen auf dem Aufruf-Stack oder globale Variablen). Wenn also zwei Objekte aufeinander verweisen, aber sonst nicht erreichbar sind, werden sie nicht als "live" markiert und gesammelt.
Wie der Name schon sagt, bezieht sich Garbage Collection auf das Entfernen von Objekten welche nicht mehr benutzt werden. Es ist eine bekannte Tatsache, dass unabhängig davon Von ihren Bereichsobjekten speichert Java Objekte in Heap. Also, wenn wir bleiben Wenn Sie Objekte erstellen, ohne den Heapspeicher zu löschen, laufen möglicherweise unsere Computer aus dem Heap-Speicherbereich und wir erhalten einen "Out of Memory" -Fehler. Müllsammlung in Java ist ein Mechanismus, der von Java gesteuert und ausgeführt wird Virtual Machine (JVM), um den von der Objekte, die nicht mehr verwendet werden. Im Gegensatz zu C ++, Müll collection in java durchlebt den Entwickler aus dem Memory Management Verwandte Aktivitäten. Die JVM führt diesen Prozess mit Hilfe von a aus Dämonenthread namens "Garbage Collector". Der Müllsammler thread ruft zuerst die Finalize-Methode des Objekts auf. Dies führt die Bereinigungsaktivität für das Objekt. Als Entwickler können wir nicht Erzwingen Sie, dass die JVM den Garbage Collector-Thread ausführt. Obwohl es welche gibt B. Runtime.gc () oder System.gc (), aber keiner von diesen gewährleistet die Ausführung von Garbage Collector Thread. Diese Methoden werden verwendet um Senden von Garbage-Collection-Anfragen an die JVM. Es liegt an dem Java Virtuelle Maschine, wenn der Speicherbereinigungsprozess initiiert wird.
Schau dir das Zeug an
Grundsätzlich funktioniert Garbage Collection, indem die Objektgraphen aus einer Anzahl vordefinierter Wurzeln durchlaufen werden. Alles, was von diesen Wurzeln aus nicht zugänglich ist, ist Müll, daher ist ein Objekt, das auf ein anderes Bezug nimmt, irrelevant, es sei denn, auf eines kann von einem oder mehreren Wurzeln zugegriffen werden.
Alles wird in Funktionsweise von Garbage Collection detaillierter erklärt.
Tags und Links java garbage-collection