8.1 Java'da zayıf referanslar
Java'da birkaç tür referans vardır.
StrongReference var - bunlar her gün oluşturduğumuz en yaygın bağlantılar.
Object object = new Object();//created an object
object = null;//can now be garbage collected
Ve üç "özel" bağlantı türü vardır - SoftReference, WeakReference, PhantomReference. Aslında, tüm bağlantı türleri arasında tek bir fark vardır - GC'nin başvurdukları nesnelerle davranışı. Her bağlantı türünün özelliklerini daha sonra daha ayrıntılı olarak tartışacağız, ancak şimdilik aşağıdaki bilgiler yeterli olacaktır:
- SoftReference esnek bir referanstır, eğer GC bir nesneye yalnızca bir esnek referanslar zinciri yoluyla erişilebildiğini görürse, o zaman onu bellekten kaldıracaktır. Belki.
- WeakReference - zayıf bir referans, GC bir nesneye yalnızca zayıf referanslar zinciri aracılığıyla erişilebildiğini görürse, o zaman onu bellekten kaldıracaktır.
- PhantomReference hayali bir referanstır, eğer GC bir nesnenin yalnızca bir hayali referanslar zinciri aracılığıyla kullanılabileceğini görürse, o zaman onu bellekten kaldıracaktır. Birkaç GC çalışmasından sonra.
Bağlantı türlerinin belirli bir yumuşaklığa sahip olduğunu da söyleyebilirsiniz:
- Normal bir sabit bağlantı, referans tipindeki herhangi bir değişkendir. Kullanılmadan önce çöp toplayıcı tarafından temizlenmez.
- Yumuşak Referans . Nesne, tüm belleğin kullanılmasına neden olmaz - bir OutOfMemoryError oluşmadan önce silinmesi garanti edilir. Çöp toplayıcının uygulamasına bağlı olarak belki daha erken.
- Zayıf Referans Daha zayıf yumuşak. Nesnenin elden çıkarılmasını engellemez; çöp toplayıcı bu tür başvuruları yok sayar.
- PhantomReferans . Bir nesnenin "ölüm" işlemi için kullanılır: nesne, çöp toplanana kadar sonlandırıldıktan sonra kullanılabilir.
Farkın ne olduğu henüz net değilse endişelenmeyin, yakında her şey yerine oturacaktır. Detaylar detaydadır ve detaylar takip edecektir.
8.2 Java'da WeakReference ve SoftReference
Öncelikle, Java'daki WeakReference ve SoftReference arasındaki farka bakalım .
Kısacası, yalnızca zayıf referanslar ona işaret ediyorsa, çöp toplayıcı bir nesnenin belleğini boşaltacaktır. Nesne SoftReferences tarafından işaret edilirse, JVM'nin ciddi bir şekilde belleğe ihtiyacı olduğunda bellek serbest bırakılır.
Bu , belirli durumlarda SoftReference'a Güçlü referansa göre kesin bir avantaj sağlar . Örneğin, SoftReference bir uygulama önbelleği uygulamak için kullanılır, dolayısıyla JVM'nin yapacağı ilk şey, yalnızca SoftReferences'ın işaret ettiği nesneleri silmek olacaktır.
WeakReference , bir ClassLoader'a referans depolamak gibi meta verileri depolamak için harikadır. Hiçbir sınıf yüklenmemişse, ClassLoader'a başvurmamalısınız. Bu nedenle WeakReference, çöp toplayıcının ClassLoader üzerindeki son güçlü referans kaldırılır kaldırılmaz işini yapmasını mümkün kılar.
Java'daki WeakReference örneği:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
Java'da SoftReference örneği:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 Java'da PhantomReference
PhantomReference örneği, WeakReference ve SoftReference örnekleriyle aynı şekilde oluşturulur, ancak nadiren kullanılır.
Bir PhantomReference, nesnenin güçlü (Strong), zayıf (WeakReference) veya yumuşak (SoftReference) referansları yoksa çöp toplanabilir.
Bunun gibi bir Phantom Reference nesnesi oluşturabilirsiniz:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference, finalize() işlevinin bir anlam ifade etmediği durumlarda kullanılabilir. Bu referans türü, bir nesneye erişmek için tasarlanmadığı için diğer türlerden farklıdır. Bu, nesnenin halihazırda sonlandırıldığının ve çöp toplayıcının hafızasını geri almaya hazır olduğunun bir işaretidir.
Bunu yapmak için çöp toplayıcı, daha sonraki işlemler için onu özel bir ReferenceQueue'ye yerleştirir . ReferenceQueue, nesne referanslarının belleği boşaltmak için yerleştirildiği yerdir.
Hayali referanslar, bir nesnenin bellekten kaldırıldığını bilmenin güvenli bir yoludur. Örneğin, büyük resimlerle ilgilenen bir uygulamayı düşünün. Diyelim ki, çöp toplama için hazır olan zaten bellekte olan bir görüntüyü belleğe yüklemek istiyoruz. Bu durumda yeni imajı belleğe yüklemeden önce çöp toplayıcının eski imajı öldürmesini beklemek istiyoruz.
Burada PhantomReference esnek ve güvenli bir seçimdir. Eski görüntü nesnesi yok edildikten sonra, eski görüntüye yapılan başvuru ReferenceQueue'ye iletilecektir. Bu bağlantıya sahip olduğumuzda, yeni görüntüyü belleğe yükleyebiliriz.