Java-Aufbewahrungszyklus (Garbage Collection)

8

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?

    
Anders 08.01.2014, 11:03
quelle

4 Antworten

15

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 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.

    
Ross Drew 08.01.2014, 11:11
quelle
4

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.

    
assylias 08.01.2014 11:13
quelle
0
  

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

Funktionsweise von Garbage Collection in Java

    
Nidhish Krishnan 08.01.2014 11:13
quelle
0

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.

    
Nick Holt 08.01.2014 11:13
quelle

Tags und Links