Koje vrste referenci postoje u Javi i koje su njihove osobine?
sobes.tech АИ
Одговор од АИ
У Јавију постоје три основне врсте референци (променљиве референце), које се разликују по понашању сакупљача отпада:
- Јакa референца (Strong Reference)
- Мека референца (Soft Reference)
- Слаба референца (Weak Reference)
- Фантомска референца (Phantom Reference)
Јака референца (Strong Reference)
Ово је најчешћи тип референце. Објекат на који указује јака референца неће бити сакупљен од стране сакупљача отпада док постоји бар једна јака референца на њега.
// Креирање објекта и јака референца на њега
Object myObject = new Object();
Мека референца (Soft Reference)
Мека референца указује на објекат који може бити сакупљен од стране сакупљача отпада ако ЈВМ треба меморија. Објекти на које указују само меке референце су гарантовано недоступни за сакупљача док се не ослободи меморија. Обично се користи за кеширање.
import java.lang.ref.SoftReference;
// Креирање објекта
Object data = new Object();
// Креирање меке референце на објекат
SoftReference<Object> softRef = new SoftReference<>(data);
// Објекат data може бити сакупљен ако је меморија недовољна
// Ако објекат није сакупљен, може се поново приступити
Object retrievedData = softRef.get();
Слаба референца (Weak Reference)
Слаба референца указује на објекат који може бити сакупљен од стране сакупљача отпада у било ком тренутку ако на њега не остану јаки референци. Често се користи за имплементацију кешова, где елементи могу бити уклоњени при недостатку меморије.
import java.lang.ref.WeakReference;
// Креирање објекта
Object cacheEntry = new Object();
// Креирање слабе референце на објекат
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry);
// Објекат cacheEntry може бити сакупљен од стране сакупљача отпада у било ком тренутку
// Провера да ли је објекат сакупљен
if (weakRef.get() == null) {
// Објекат је сакупљен
}
Фантомска референца (Phantom Reference)
Фантомска референца се користи у комбинацији са ReferenceQueue за извршавање акција пре него што објекат буде потпуно уклоњен из меморије. get() увек враћа null.
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
// Креирање објекта за праћење
Object resource = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
// Креирање фантомске референце и повезивање са редом
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue);
// У посебном току можете пратити ред
// Када је објекат resource спреман за потпуно уклањање, фантомска референца ће се појавити у реду
Карактеристике и поређење:
| Тип референце | Сакупљач отпада | Добити објекат преко get() |
Коришћење |
|---|---|---|---|
| Јакa референца | Не | Да | Обична употреба |
| Мека референца | Може да сакупи | Да (ако није сакупљена) | Кеширање (при недостатку меморије) |
| Слаба референца | Може да сакупи | Да (ако није сакупљена) | Кеширање (ако нема јаких референци) |
| Фантомска референца | Може да сакупи | Не (увек null) | Чишћење ресурса пре уклањања (са ReferenceQueue) |