Sobes.tech
Middle

Jakie rodzaje referencji istnieją w Javie i jakie są ich cechy?

sobes.tech AI

Odpowiedź od AI

W Javie istnieją trzy główne typy referencji (zmiennych referencyjnych), które różnią się zachowaniem zbieracza śmieci:

  • Silna Referencja (Strong Reference)
  • Miękka Referencja (Soft Reference)
  • Słaba Referencja (Weak Reference)
  • Referencja Fantomowa (Phantom Reference)

Silna Referencja (Strong Reference)

Jest to najpowszechniejszy typ referencji. Obiekt wskazywany przez silną referencję nie zostanie zebrany przez garbage collector, dopóki istnieje co najmniej jedna silna referencja do niego.

// Tworzenie obiektu i silnej referencji do niego
Object myObject = new Object(); 

Miękka Referencja (Soft Reference)

Miękka referencja wskazuje na obiekt, który może zostać zebrany przez garbage collector, jeśli JVM potrzebuje pamięci. Obiekty wskazywane tylko przez miękkie referencje nie będą gwarantowanie zebrane, dopóki JVM nie będzie pilnie potrzebować zwolnienia pamięci. Często używana do buforowania.

import java.lang.ref.SoftReference;

// Tworzenie obiektu
Object data = new Object(); 
// Tworzenie miękkiej referencji do obiektu
SoftReference<Object> softRef = new SoftReference<>(data); 

// Obiekt data może zostać zebrany, jeśli brakuje pamięci
// Jeśli obiekt nie został zebrany, można go odzyskać
Object retrievedData = softRef.get(); 

Słaba Referencja (Weak Reference)

Słaba referencja wskazuje na obiekt, który może zostać zebrany przez garbage collector w dowolnym momencie, jeśli nie ma silnych referencji do niego. Słabe referencje są często używane do implementacji cache, gdzie elementy mogą być usunięte w przypadku braku pamięci.

import java.lang.ref.WeakReference;

// Tworzenie obiektu
Object cacheEntry = new Object(); 
// Tworzenie słabej referencji do obiektu
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Obiekt cacheEntry może zostać zebrany w dowolnym momencie
// Sprawdzanie, czy obiekt został zebrany
if (weakRef.get() == null) { 
    // Obiekt został zebrany
}

Referencja Fantomowa (Phantom Reference)

Referencja fantomowa jest używana w połączeniu z ReferenceQueue, aby wykonywać działania przed całkowitym usunięciem obiektu z pamięci. Nie można uzyskać obiektu przez referencję fantomową (get() zawsze zwraca null). Używana głównie do zarządzania zasobami, które wymagają specjalnego czyszczenia.

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

// Tworzenie obiektu do śledzenia
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Tworzenie referencji fantomowej i powiązanie z kolejką
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// W osobnym wątku można monitorować kolejkę referenceQueue
// Gdy obiekt resource będzie gotowy do usunięcia, pojawi się w kolejce

Cechy i porównanie:

Typ referencji Garbage Collector Uzyskanie obiektu przez get() Użycie
Silna Referencja Nie Tak Normalne użycie
Miękka Referencja Może zbierać Tak (jeśli nie zebrano) Buforowanie (w przypadku braku pamięci)
Słaba Referencja Może zbierać Tak (jeśli nie zebrano) Buforowanie (jeśli brak silnych referencji)
Referencja Fantomowa Może zbierać Nie (zawsze null) Czyszczenie zasobów przed usunięciem (z ReferenceQueue)