Milyen típusú hivatkozások léteznek Java-ban, és milyen jellemzőik vannak?
sobes.tech MI
Válasz az MI-től
A Java-ban három fő hivat típus létezik (referenciam változók), amelyek a szemétgyűjtő viselkedésében különböznek:
- Erős Hivatkozás (Strong Reference)
- Puha Hivatkozás (Soft Reference)
- Gyenge Hivatkozás (Weak Reference)
- Fantom Hivatkozás (Phantom Reference)
Erős Hivatkozás (Strong Reference)
Ez a leggyakoribb hivatkozási típus. Az objektum, amelyre erős hivatkozás mutat, nem lesz összegyűjtve a szemétgyűjtő által, amíg legalább egy erős hivatkozás mutat rá.
// Objektum létrehozása és erős hivatkozás rá
Object myObject = new Object();
Puha Hivatkozás (Soft Reference)
Puha hivatkozás egy olyan objektumra mutat, amelyet a JVM szükség esetén összegyűjthet. Azokat az objektumokat, amelyek csak puha hivatkozásokkal rendelkeznek, garantáltan nem gyűjti össze a szemétgyűjtő, amíg a memória nem szűkös. Általában gyorsítótárazásra használják.
import java.lang.ref.SoftReference;
// Objektum létrehozása
Object data = new Object();
// Puha hivatkozás létrehozása
SoftReference<Object> softRef = new SoftReference<>(data);
// Az adat összegyűjthető, ha a memória kevés
// Ha az objektum nem gyűjtött össze, vissza lehet szerezni
Object retrievedData = softRef.get();
Gyenge Hivatkozás (Weak Reference)
Gyenge hivatkozás egy olyan objektumra mutat, amelyet a szemétgyűjtő bármikor összegyűjthet, ha nincs más erős hivatkozás rá. Gyakran cache-ként használják.
import java.lang.ref.WeakReference;
// Objektum létrehozása
Object cacheEntry = new Object();
// Gyenge hivatkozás létrehozása
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Az objektum összegyűjthető bármikor
// Ellenőrzés, hogy az objektum összegyűjtött-e
if (weakRef.get() == null) {
// Az objektum összegyűjtött
}
Fantom Hivatkozás (Phantom Reference)
A fantom hivatkozás a ReferenceQueue-val együtt használható, az objektum teljes törlése előtt végrehajtandó műveletekhez. A get() mindig null-t ad.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Figyelni kívánt objektum létrehozása
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Fantom hivatkozás létrehozása és kötése a sorhoz
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// Egy külön szálon figyelheti a sorokat
// Amikor az objektum készen áll a végső törlésre, a fantom hivatkozás megjelenik a sorban
Jellemzők és összehasonlítás:
| Hivat típus | Gyűjtő | get()-el elérhető objektum |
Használat |
|---|---|---|---|
| Erős Hivatkozás | Nem | Igen | Szokásos használat |
| Puha Hivatkozás | Lehet | Igen (ha nem gyűjtötték össze) | Gyorsítótár (memória szűkössége esetén) |
| Gyenge Hivatkozás | Lehet | Igen (ha nem gyűjtötték össze) | Gyorsítótár (ha nincsenek erős hivatkozások) |
| Fantom Hivatkozás | Lehet | Nem (mindig null) | Erőforrások tisztítása a ReferenceQueue-val |