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)
Leave a Reply