Welke soorten referenties zijn er in Java en wat zijn hun kenmerken?
sobes.tech AI
Antwoord van AI
In Java, er bestaan drie hoofdtypen referenties (referentievariabelen), die verschillen in gedrag van de garbage collector:
- Sterke Referentie (Strong Reference)
- Zachte Referentie (Soft Reference)
- Zwakke Referentie (Weak Reference)
- Fantom Referentie (Phantom Reference)
Sterke Referentie (Strong Reference)
Dit is het meest voorkomende type referentie. Een object waarnaar wordt verwezen door een sterke referentie wordt niet verzameld door de garbage collector zolang er ten minste één sterke referentie naar bestaat.
// Object en een sterke referentie maken
Object myObject = new Object();
Zachte Referentie (Soft Reference)
Een zachte referentie wijst naar een object dat door de garbage collector kan worden verzameld als de JVM geheugen nodig heeft. Objecten die alleen door zachte referenties worden aangewezen, worden niet gegarandeerd verzameld totdat de JVM dringend geheugen moet vrijmaken. Vaak gebruikt voor caching.
import java.lang.ref.SoftReference;
// Object maken
Object data = new Object();
// Zachte referentie maken naar het object
SoftReference<Object> softRef = new SoftReference<>(data);
// Het object data kan worden verzameld als het geheugen ontoereikend is
// Als het object niet is verzameld, kan het worden teruggehaald
Object retrievedData = softRef.get();
Zwakke Referentie (Weak Reference)
Een zwakke referentie wijst naar een object dat op elk moment kan worden verzameld door de garbage collector als er geen sterke referenties meer naar zijn.
import java.lang.ref.WeakReference;
// Object maken
Object cacheEntry = new Object();
// Zwakke referentie maken
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Het cacheEntry-object kan op elk moment worden verzameld
// Controleren of het object is verzameld
if (weakRef.get() == null) {
// Het object is verzameld
}
Fantom Referentie (Phantom Reference)
Een fantom referentie wordt gebruikt in combinatie met ReferenceQueue om acties uit te voeren voordat het object volledig uit het geheugen wordt verwijderd. Het is niet mogelijk om het object te krijgen via een fantom referentie (get() geeft altijd null). Wordt vooral gebruikt voor resourcebeheer dat speciale opruiming vereist.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Object maken voor tracking
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Fantom referentie maken en koppelen aan de wachtrij
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// In een aparte thread kan de referenceQueue worden gemonitord
// Wanneer het resource-object klaar is om te worden verwijderd, verschijnt de fantom referentie in de wachtrij
Kenmerken en vergelijking:
| Referentietype | Garbage Collector | Object verkrijgen via get() |
Gebruik |
|---|---|---|---|
| Sterke Referentie | Nee | Ja | Normaal gebruik |
| Zachte Referentie | Kan verzamelen | Ja (als niet verzameld) | Caching (bij geheugen tekort) |
| Zwakke Referentie | Kan verzamelen | Ja (als niet verzameld) | Caching (als er geen sterke referenties zijn) |
| Fantom Referentie | Kan verzamelen | Nee (altijd null) | Resource cleanup voor verwijdering (met ReferenceQueue) |