Jakie są typy referencji w Javie i czym się charakteryzują?
W języku Java istnieją różne typy referencji, które określają sposób przechowywania i zarządzania obiektami w pamięci. Kluczowe typy referencji to:
- Strong Reference (Silna referencja)
- Soft Reference (Miękka referencja)
- Weak Reference (Słaba referencja)
- Phantom Reference (Widmowa referencja)
1. Strong Reference (Silna referencja)
Jest to domyślny typ referencji w Javie. Obiekt z silną referencją nie jest usuwany przez Garbage Collector (GC), dopóki referencja do niego istnieje.
public class StrongReferenceExample {
public static void main(String[] args) {
String strongRef = new String("Hello, Java!"); // Silna referencja
System.out.println(strongRef); // Obiekt nie zostanie usunięty przez GC
}
}
Charakterystyka
- Najczęściej używany typ referencji.
- GC nie usuwa obiektów, jeśli istnieje do nich silna referencja.
- Może prowadzić do wycieków pamięci, jeśli referencje nie są zwalniane.
2. Soft Reference (Miękka referencja)
Soft Reference pozwala na usunięcie obiektu, jeśli w systemie zaczyna brakować pamięci. Jest przydatna do implementacji pamięci podręcznej (cache).
import java.lang.ref.SoftReference;
public class SoftReferenceExample {
public static void main(String[] args) {
String data = new String("Soft Reference Example");
SoftReference softRef = new SoftReference<>(data);
data = null; // Usunięcie silnej referencji
if (softRef.get() != null) {
System.out.println("Obiekt nadal istnieje: " + softRef.get());
} else {
System.out.println("Obiekt został usunięty przez GC");
}
}
}
Charakterystyka
- GC usuwa obiekty referencjonowane przez SoftReference tylko wtedy, gdy brakuje pamięci.
- Używane w mechanizmach cache’owania, np. w aplikacjach webowych.
- Zapewniają lepsze zarządzanie pamięcią niż silne referencje.
3. Weak Reference (Słaba referencja)
Weak Reference pozwala na usunięcie obiektu przez GC podczas kolejnego cyklu usuwania nieużywanych obiektów.
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
String data = new String("Weak Reference Example");
WeakReference weakRef = new WeakReference<>(data);
data = null; // Usunięcie silnej referencji
System.gc(); // Wymuszenie GC
if (weakRef.get() != null) {
System.out.println("Obiekt nadal istnieje: " + weakRef.get());
} else {
System.out.println("Obiekt został usunięty przez GC");
}
}
}
Charakterystyka
- GC usuwa obiekty referencjonowane przez WeakReference szybciej niż SoftReference.
- Używane np. w strukturach danych, takich jak
WeakHashMap, gdzie klucze mogą zostać automatycznie usunięte. - Przydatne do unikania wycieków pamięci w przypadku zbędnych obiektów.
4. Phantom Reference (Widmowa referencja)
Phantom Reference jest używana do monitorowania, kiedy obiekt zostanie usunięty przez GC. Nie można uzyskać dostępu do obiektu poprzez get(), zwraca on zawsze null.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceExample {
public static void main(String[] args) {
String data = new String("Phantom Reference Example");
ReferenceQueue queue = new ReferenceQueue<>();
PhantomReference phantomRef = new PhantomReference<>(data, queue);
data = null; // Usunięcie silnej referencji
System.gc(); // Wymuszenie GC
if (phantomRef.get() == null) {
System.out.println("Obiekt został oznaczony do usunięcia");
}
}
}
Charakterystyka
- Nie pozwala na dostęp do obiektu (zawsze zwraca
null). - Używane do precyzyjnego zarządzania pamięcią (np. zwalniania zasobów systemowych).
- Przydatne w implementacjach niestandardowych systemów zarządzania pamięcią.
Podsumowanie
| Typ referencji | Usuwanie przez GC | Zastosowanie |
|---|---|---|
| Strong Reference | Nigdy (dopóki referencja istnieje) | Standardowe użycie w Javie |
| Soft Reference | Gdy brakuje pamięci | Cache, mechanizmy optymalizacji pamięci |
| Weak Reference | Przy następnym uruchomieniu GC | WeakHashMap, eliminowanie zbędnych obiektów |
| Phantom Reference | Po usunięciu przez GC | Śledzenie usuwania obiektów, zwalnianie zasobów |
Każdy typ referencji znajduje zastosowanie w odpowiednich przypadkach, a ich znajomość pomaga w efektywnym zarządzaniu pamięcią i unikaniu wycieków.

