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)
No Comment! Be the first one.