Welche Arten von Referenzen gibt es in Java und was sind ihre Eigenschaften?
sobes.tech KI
Antwort von AI
In Java gibt es drei Haupttypen von Referenzen (Referenzvariablen), die sich im Verhalten des Garbage Collectors unterscheiden:
- Starke Referenz (Strong Reference)
- Weiche Referenz (Soft Reference)
- Schwache Referenz (Weak Reference)
- Phantom Referenz (Phantom Reference)
Starke Referenz (Strong Reference)
Dies ist der am häufigsten verwendete Referenztyp. Ein Objekt, auf das eine starke Referenz zeigt, wird vom Garbage Collector nicht gesammelt, solange mindestens eine starke Referenz darauf existiert.
// Erstellen eines Objekts und einer starken Referenz darauf
Object myObject = new Object();
Weiche Referenz (Soft Reference)
Eine weiche Referenz zeigt auf ein Objekt, das vom Garbage Collector gesammelt werden kann, wenn die JVM Speicher benötigt. Objekte, die nur durch weiche Referenzen referenziert werden, werden garantiert nicht gesammelt, bis die JVM dringend Speicher freigeben muss. Wird häufig für Caching verwendet.
import java.lang.ref.SoftReference;
// Erstellen eines Objekts
Object data = new Object();
// Erstellen einer weichen Referenz auf das Objekt
SoftReference<Object> softRef = new SoftReference<>(data);
// Das Objekt data kann gesammelt werden, wenn der Speicher knapp wird
// Wenn das Objekt nicht gesammelt wurde, kann es wieder abgerufen werden
Object retrievedData = softRef.get();
Schwache Referenz (Weak Reference)
Eine schwache Referenz zeigt auf ein Objekt, das vom Garbage Collector jederzeit gesammelt werden kann, wenn keine starken Referenzen mehr darauf zeigen. Schwache Referenzen werden häufig für Implementierungen von Caches verwendet, bei denen Elemente bei Speicherknappheit entfernt werden können.
import java.lang.ref.WeakReference;
// Erstellen eines Objekts
Object cacheEntry = new Object();
// Erstellen einer schwachen Referenz auf das Objekt
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Das Objekt cacheEntry kann jederzeit gesammelt werden
// Überprüfung, ob das Objekt gesammelt wurde
if (weakRef.get() == null) {
// Das Objekt wurde gesammelt
}
Phantom Referenz (Phantom Reference)
Eine Phantom Referenz wird in Verbindung mit ReferenceQueue verwendet, um Aktionen auszuführen, bevor das Objekt vollständig aus dem Speicher entfernt wird. Es ist nicht möglich, das Objekt über eine Phantom Referenz zu erhalten (get() gibt immer null zurück). Wird hauptsächlich für Ressourcenverwaltung verwendet, die eine spezielle Bereinigung erfordern.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Erstellen eines Objekts zur Überwachung
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Erstellen einer Phantom Referenz und Verknüpfung mit der Warteschlange
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// In einem separaten Thread kann die referenceQueue überwacht werden
// Wenn das resource-Objekt bereit ist, gelöscht zu werden, erscheint die Phantom Referenz in der Warteschlange
Eigenschaften und Vergleich:
| Referenztyp | Garbage Collector | Zugriff auf Objekt mit get() |
Verwendung |
|---|---|---|---|
| Starke Referenz | Nein | Ja | Normale Verwendung |
| Weiche Referenz | Kann sammeln | Ja (wenn nicht gesammelt) | Caching (bei Speicherknappheit) |
| Schwache Referenz | Kann sammeln | Ja (wenn nicht gesammelt) | Caching (wenn keine starken Referenzen) |
| Phantom Referenz | Kann sammeln | Nein (immer null) | Ressourcenbereinigung vor Entfernung (mit ReferenceQueue) |