Sobes.tech
Middle

Millised on Java viited ja nende omadused?

sobes.tech AI

Vastus AI-lt

Java-s on kolm peamist viisi viidet (viidete muutujad), mis erinevad prügikoristaja käitumise poolest:

  • Tugev Viide (Strong Reference)
  • Mõõdukas Viide (Soft Reference)
  • Nõrk Viide (Weak Reference)
  • Fantom Viide (Phantom Reference)

Tugev Viide (Strong Reference)

See on kõige levinum viite tüüp. Objekti, millele viitab tugev viide, ei koguta prügikoristaja, kuni vähemalt üks tugev viide sellele objekti viitab.

// Objekti loomine ja tugevate viidete määramine
Object myObject = new Object(); 

Mõõdukas Viide (Soft Reference)

Mõõdukas viide viitab objekti, mida võib koguda, kui JVM vajab mälu. Objekte, millele viitab ainult mõõdukas viide, ei koguta prügikoristaja, kuni JVM ei vaja mälu vabastamist. Tavaliselt kasutatakse vahemälu jaoks.

import java.lang.ref.SoftReference;

// Objekti loomine
Object data = new Object(); 
// Mõõduka viite loomine
SoftReference<Object> softRef = new SoftReference<>(data); 

// Kui mälu on otsas, võib objekt koguda
// Kui objekt ei ole kogutud, saab selle tagasi saada
Object retrievedData = softRef.get(); 

Nõrk Viide (Weak Reference)

Nõrk viide viitab objekti, mida võib koguda igal ajal, kui sellele ei ole järele jäänud tugevaid viiteid. Sageli kasutatakse vahemälu rakendamisel, kus elemendid võivad olla välja visatud, kui mälu on otsas.

import java.lang.ref.WeakReference;

// Objekti loomine
Object cacheEntry = new Object(); 
// Nõrga viite loomine
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Objekti `cacheEntry` võib koguda igal ajal
// Kontroll, kas objekt on kogutud
if (weakRef.get() == null) { 
    // Objekti on kogutud
}

Fantom Viide (Phantom Reference)

Fantom viide kasutatakse koos ReferenceQueue-ga, et teha toiminguid enne, kui objekt täielikult eemaldatakse mälust. Objektile kaudu saadaolevat objekti ei ole võimalik (get() alati tagastab null). Seda kasutatakse peamiselt ressursside haldamiseks, mis nõuavad erilist puhastust.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Objekti jälgimiseks loomine
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Fantomviite loomine ja ühendamine järjekorraga
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Eraldi vooges võib jälgida referenceQueue-d
// Kui objekt resource on valmis lõplikuks eemaldamiseks, ilmub fantomviide järjekorda

Omadused ja võrdlus:

Viite tüüp Prügikoristaja Saad objekti get() kaudu Kasutus
Tugev Viide Ei koguta Jah Tavaline kasutus
Mõõdukas Viide Võib koguda Jah (kui ei koguta) Vahemälu (mälu puudusel)
Nõrk Viide Võib koguda Jah (kui ei koguta) Vahemälu (kui pole tugevaid viiteid)
Fantom Viide Võib koguda Ei (alati null) Ressursside puhastamine enne eemaldamist (ReferenceQueue-ga)