Zwei Objektverweise zeigen aufeinander

8

In Ziel C besteht die Möglichkeit, dass zwei verschiedene Referenzen aufeinander verweisen können.

Aber ist das in Java möglich? Ich meine, können zwei Objektreferenzen aufeinander verweisen? Wenn es möglich ist, wann werden sie Müll gesammelt?

Und, im Fall von geschachtelten Klassen, sind zwei Objekte (innere Klassen und äußere Klassen) miteinander verknüpft - wie werden diese Objekte gesammelt?

    
Sai Chaithanya 11.07.2013, 07:05
quelle

3 Antworten

24

Ich nehme an, Sie sprechen von zirkulären Referenzen. Java GC betrachtet Objekte als "Müll", wenn sie nicht über eine Kette von einem GC-Root aus erreichbar sind. Auch wenn Objekte aufeinander verweisen, um einen Zyklus zu bilden, sind sie dennoch für GC geeignet, wenn sie von der Wurzel abgeschnitten werden.

Es gibt vier Arten von GC-Wurzeln in Java:

  1. Lokale Variablen werden vom Stack eines Threads am Leben erhalten. Dies ist keine reale virtuelle Referenz und ist daher nicht sichtbar. Für alle Absichten und Zwecke sind lokale Variablen GC-Wurzeln.

  2. Aktive Java-Threads werden immer als Live-Objekte betrachtet und sind daher GC-Roots. Dies ist besonders wichtig für lokale Threadvariablen.

  3. Statische Variablen werden von ihren Klassen referenziert. Diese Tatsache macht sie de facto GC-Wurzeln. Klassen selbst können Garbage-Collected sein, wodurch alle referenzierten statischen Variablen entfernt werden. Dies ist besonders wichtig, wenn wir Anwendungsserver, OSGi-Container oder Klassenlader im Allgemeinen verwenden.

  4. JNI-Referenzen sind Java-Objekte, die der systemeigene Code als Teil eines JNI-Aufrufs erstellt hat. Auf diese Weise erstellte Objekte werden speziell behandelt, weil die JVM nicht weiß, ob sie vom systemeigenen Code referenziert wird oder nicht. Solche Objekte stellen eine ganz besondere Form von GC root dar.

Sie können hier auch weitere Informationen lesen.

    
NINCOMPOOP 11.07.2013, 07:08
quelle
5

Ja, Sie können das tun. So:

%Vor%

Sie sind Müll gesammelt, wenn beiden Objekte nicht durch irgendetwas anderes als sie zugespitzt, oder andere Gegenstände, die „nicht erreichbar“ aus laufenden Code sind. Die Java Müllsammler sind „Tracing“ Müllsammler , was bedeutet, dass sie diese Art von Problem entdecken .

Im Gegensatz dazu Referenz gezählt Systeme (wie Objective C, ohne seine "modern" Garbage Collection -. ich weiß nicht, was der Standard ist) kann diese Art von Problem normalerweise nicht erkennen, so können die Objekte geleckt werden

    
Calum 11.07.2013 07:12
quelle
3

Natürlich können Objekte sich gegenseitig referenzieren. Sie könnten einfach den this -Zeiger in beiden Objekten einander übergeben, was vollkommen korrekt ist.

Das bedeutet jedoch nicht, dass die Objekte weiterhin vom GC-Root aus zugänglich sind. Stellen Sie es sich als einen (graphischen) Baum vor. Wenn Sie einen vollständigen Zweig vom Stamm abschneiden, ist der gesamte Zweig verloren, egal wie viele Objekte beteiligt sind oder ob Referenzen zueinander bestehen.

    
Devolus 11.07.2013 07:12
quelle

Tags und Links