Arşivler

Java’da Referans Türleri (Strong, Phantom, Soft, Weak Reference )

Java'da Referans Türleri (Strong, Phantom, Soft, Weak Reference )
Java'da Referans Türleri (Strong, Phantom, Soft, Weak Reference )

Bu yazıda Java’da Referans Türlerinin ne olduğuna ve nasıl kullanıldığına bakacağız.

Java’daki referans türleri olmasının amacı nesnelerimizin Garbage Collectorun nasıl kontrol edeceğine müdahale etmemize olanak tanır.

Referans Türleri

Strong Reference

Hepimizin sıklıkla kullandığı referans türüdür.

Student student = new Student();Code language: Java (java)

Garbage collector bu nesne null olmadığı sürece hiç bir zaman temizleyemez.

Soft Reference

Bellek yetersizliği durumunda garbage collector tarafından toplanabilecek referans türüdür. Bellek rahatsa, nesne bellekte kalmaya devam eder.

Student student = new Student();
SoftReference<Student> softReference = new SoftReference<>(student);Code language: Java (java)

Oluşturduğumuz nesnemizi softreference olarak tanımladık.

student = null;Code language: Java (java)

Eğer bellekte yer varsa aşağıdaki kod ile nesneye tekrar ulaşabilmemiz mümkün olmaktadır.

System.out.println(softReference.get());Code language: Java (java)

Weak Reference

Nesnenin bir sonraki çöp toplama işleminde toplanmasına izin veren bir referans türüdür. Bellek yetersizliği olmasa bile nesne toplanabilir.

Student student = new Student();

WeakReference<Student> weakReference = new WeakReference<>(student);Code language: Java (java)

Nesnemizi weakreference olarak tanımladık. Şimdi yine null değer verdikten GC yi sonra çağıralım.

student = null;
System.gc();Code language: Java (java)

GC çalıştığında, zayıf referans artık nesneye erişim sağlayamaz.

Student retrievedStudent = weakRef.get();Code language: Java (java)

Phantom Reference

Nesne bellekten temizlenmeden önce yapılması gereken işlemler için kullanılır. Ancak, bu referans ile nesneye doğrudan erişim mümkün değildir. En zayıf referans türüdür. Phantom Reference kullanılırken ReferenceQueue ile birlikte kullanmak gerekmektedir. Kaldırma işlemi için bir ReferenceQueue pool’a eklenir ve bu kuyruktan takibini yapabiliriz.

ReferenceQueue<Student> refQueue = new ReferenceQueue<>();

Studentstudent = new Student();
PhantomReference<Student> phantomRef = new PhantomReference<>(student, refQueue);Code language: Java (java)

Tanımlamızı yaptık ve nesnemize null değer atayalım.

student = null;
System.gc();Code language: Java (java)

Unutmamamız gereken bir yer nesnemiz ReferenceQueue ya eklendiği için phantomRef.get() her zaman null döner.

Student retrievedStudent = phantomRef.get();Code language: Java (java)