Sobes.tech
Middle

Java'da hangi tür referanslar vardır ve özellikleri nelerdir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da, çöp toplayıcının davranışına göre farklılık gösteren üç ana referans türü (referans değişkenleri) vardır:

  • Güçlü Referans (Strong Reference)
  • Yumuşak Referans (Soft Reference)
  • Zayıf Referans (Weak Reference)
  • Hayalet Referans (Phantom Reference)

Güçlü Referans (Strong Reference)

Bu, en yaygın referans türüdür. Güçlü bir referansın gösterdiği nesne, en az bir güçlü referans olduğu sürece çöp toplayıcı tarafından toplanmaz.

// Bir nesne oluşturma ve ona güçlü referans
Object myObject = new Object(); 

Yumuşak Referans (Soft Reference)

Bir yumuşak referans, JVM belleğe ihtiyaç duyarsa toplanabilecek bir nesneye işaret eder. Sadece yumuşak referanslarla işaret edilen nesneler, JVM acil bellek boşaltması gerektirmediği sürece toplanmaz. Genellikle önbellekleme için kullanılır.

import java.lang.ref.SoftReference;

// Bir nesne oluşturma
Object data = new Object(); 
// Nesneye yumuşak referans oluşturma
SoftReference<Object> softRef = new SoftReference<>(data); 

// Bellek yetersizse nesne toplanabilir
// Nesne toplanmadıysa, geri alınabilir
Object retrievedData = softRef.get(); 

Zayıf Referans (Weak Reference)

Zayıf referans, herhangi bir zamanda toplanabilecek bir nesneye işaret eder, eğer ona güçlü referans kalmamışsa. Zayıf referanslar, bellek yetersizliği durumunda nesneleri kaldırmak için sıklıkla kullanılır.

import java.lang.ref.WeakReference;

// Bir nesne oluşturma
Object cacheEntry = new Object(); 
// Nesneye zayıf referans oluşturma
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// cacheEntry nesnesi herhangi bir zamanda toplanabilir
// Nesnenin toplanıp toplanmadığını kontrol etme
if (weakRef.get() == null) { 
    // Nesne toplanmış
}

Hayalet Referans (Phantom Reference)

Hayalet referans, ReferenceQueue ile birlikte kullanılır ve nesne tamamen bellekten silinmeden önce işlemler yapmak için kullanılır. Nesneye get() ile erişilemez (null döner). Özellikle kaynakların yönetimi için kullanılır, bu kaynakların özel temizlenmesi gerekebilir.

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

// İzleme için nesne oluşturma
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Hayalet referans oluşturma ve kuyruğa bağlama
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Ayrı bir iş parçacığında, referenceQueue izlenebilir
// resource nesnesi tamamen silinmeye hazır olduğunda, hayalet referans kuyrukta görünecektir

Özellikler ve karşılaştırma:

Referans Türü Çöp Toplayıcı get() ile nesne alınabilir mi Kullanım
Güçlü Referans Yok Evet Normal kullanım
Yumuşak Referans Toplayabilir Evet (silinmediyse) Önbellekleme (bellek yetersizliği durumunda)
Zayıf Referans Toplayabilir Evet (silinmediyse) Önbellekleme (güçlü referans yoksa)
Hayalet Referans Toplayabilir Hayır (her zaman null) Kaynakların temizlenmesi (ReferenceQueue ile)