Sobes.tech
Middle

Kokios yra Java nuorodų rūšys ir kokios jų savybės?

sobes.tech AI

Atsakymas iš AI

Java yra trys pagrindiniai nuorodų tipai (nuorodų kintamieji), kurie skiriasi atsižvelgiant į atminties surinkėjo elgseną:

  • Stipri Nuoroda (Strong Reference)
  • Minkšta Nuoroda (Soft Reference)
  • Silpna Nuoroda (Weak Reference)
  • Fantominė Nuoroda (Phantom Reference)

Stipri Nuoroda (Strong Reference)

Tai dažniausiai pasitaikantis nuorodos tipas. Objektas, kurį nurodo stipri nuoroda, nebus surinktas, kol egzistuos bent viena stipri nuoroda į jį.

// Objekto sukūrimas ir stiprios nuorodos priskyrimas
Object myObject = new Object(); 

Minkšta Nuoroda (Soft Reference)

Minkšta nuoroda nurodo į objektą, kuris gali būti surinktas, jei JVM reikės atminties. Objektai, kuriuos nurodo tik minkštos nuorodos, garantuotai nebus surinkti, kol JVM nebus reikalinga atlaisvinti atmintį. Paprastai naudojama talpyklose.

import java.lang.ref.SoftReference;

// Objekto sukūrimas
Object data = new Object(); 
// Minkštos nuorodos sukūrimas
SoftReference<Object> softRef = new SoftReference<>(data); 

// Jei atmintis trūksta, objektas gali būti surinktas
// Jei objektas nebuvo surinktas, jį galima gauti atgal
Object retrievedData = softRef.get(); 

Silpna Nuoroda (Weak Reference)

Silpna nuoroda nurodo į objektą, kuris gali būti surinktas bet kuriuo metu, jei nėra jokių stiprių nuorodų į jį. Dažnai naudojama talpyklų įgyvendinimui, kur elementai gali būti išmesti, jei trūksta atminties.

import java.lang.ref.WeakReference;

// Objekto sukūrimas
Object cacheEntry = new Object(); 
// Silpnos nuorodos sukūrimas
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Objekto `cacheEntry` gali būti surinktas bet kuriuo metu
// Patikrinimas, ar objektas buvo surinktas
if (weakRef.get() == null) { 
    // Objekas buvo surinktas
}

Fantominė Nuoroda (Phantom Reference)

Fantominė nuoroda naudojama kartu su ReferenceQueue, kad būtų galima atlikti veiksmus prieš visiškai ištrynus objektą iš atminties. Gauti objektą per fantominę nuorodą neįmanoma (get() visada grąžina null). Pagrindinis naudojimas – išteklių valdymas, kurie reikalauja ypatingo valymo.

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

// Objekto sukūrimas stebėjimui
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Fantominės nuorodos sukūrimas ir susiejimas su eile
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Atskirame sraute galima stebėti referenceQueue
// Kai objektas resource bus paruoštas galutiniam ištrynimui, fantominė nuoroda pasirodys eilėje

Savybės ir palyginimas:

Nuorodos tipas Surinkėjas Gauti objektą per get() Naudojimas
Stipri Nuoroda Nėra surinkimo Taip Įprastas naudojimas
Minkšta Nuoroda Gali surinkti Taip (jei ne surinkta) Talpykla (kai trūksta atminties)
Silpna Nuoroda Gali surinkti Taip (jei ne surinkta) Talpykla (jei nėra stiprių nuorodų)
Fantominė Nuoroda Gali surinkti Ne (visada null) Išteklių valymas prieš ištrynimą (su ReferenceQueue)