8.1 Java-da Zəif Linklər
Java-da bir neçə növ linklər var.
StrongReference adlanan linklər var ki, bu linklər bizim hər gün yaratdığımız adi linklərdir.
Object object = new Object();//obyekt yaratdım
object = null;//artıq zibil toplayıcısı tərəfindən yığıla bilər
Və üç “xüsusi” növ link var — SoftReference, WeakReference, PhantomReference. Əslində, bütün bu link növləri arasındakı fərq yalnız bir dənədir - onlar üzərindən istinad edilən obyektlərlə GC-nin davranışı. Biz hər bir link növünün xüsusiyyətlərini daha ətraflı müzakirə edəcəyik, amma hələlik aşağıdakı bilgilər kifayət edəcək:
- SoftReference — yumşaq link, əgər GC görsə ki, obyekt yalnız soft-linklər zənciri ilə əlçatandır, o, onu yaddaşdan siləcək. Yəqin ki.
- WeakReference – zəif link, əgər GC görsə ki, obyekt yalnız weak-linklər zənciri ilə əlçatandır, o, onu yaddaşdan siləcək.
- PhantomReference — fantom link, əgər GC görsə ki, obyekt yalnız phantom-linklər zənciri ilə əlçatandır, onu yaddaşdan siləcək. Bir neçə dəfə GC işə düşdükdən sonra.
Link növlərinin bir növ yumşaqlıq dərəcəsi olduğunu da söyləyə bilərik:
- Adi sərt link – hər hansı bir referans tipli dəyişən. Zibil toplayıcı tərəfindən yalnız istifadəsiz olduqda təmizlənəcək.
- SoftReference. Obyekt bütün yaddaşın tükənməsinə səbəb olmayacaq – OutOfMemoryError yaranmadan əvvəl mütləq silinəcək. Ola bilər ki, daha tez, zibil toplayıcının həyata keçirilməsindən asılıdır.
- WeakReference. Yumşaq linkdən daha zəifdir. Obyektin istifadəsinə mane olmur, zibil toplayıcı bu tip linkləri görməzdən gəlir.
- PhantomReference. Obyektin “ölümdən əvvəlki” işlənməsi üçün istifadə olunur: obyekt finalizasiya edildikdən sonra əlçatandır, lakin zibil toplayıcı tərəfindən təmizlənməyib.
Əgər hələ fərqi başa düşmürsünüzsə, narahat olmayın, tezliklə hər şey yerinə oturacaq. Detallar kiçik şeylərdədir və detallar daha sonra gələcək.
8.2 Java-da WeakReference və SoftReference
Əvvəlcə, Java-da WeakReference və SoftReference arasındakı fərqi nəzərdən keçirək.
Qısa desək, zibil toplayıcısı obyekti yalnız zəif linklər göstərirsə, yaddaşı azad edəcək. Obyektə SoftReferences göstərirsə, yaddaşın azad edilməsi yalnız JVM-in yaddaşa ciddi ehtiyacı olduqda baş verir.
Bu, bəzi hallarda SoftReference-nin Strong linklərdən üstünlük əldə etməsinə imkan verir. Məsələn, SoftReference tətbiqin keşi üçün istifadə olunur, buna görə JVM ilk növbədə yalnız SoftReferences göstərilən obyektləri silecek.
WeakReference, məsələn, ClassLoader-ə istinad kimi metadata saxlanması üçün əladır. Əgər bir sinif yüklənməyibsə, ClassLoader-ə istinad etməyə dəyməz. Məhz buna görə WeakReference zibil toplayıcısına ClassLoader ilə işini yerinə yetirmək imkanı yaradır, mənalı olan bütün güclü linklər silindikdən sonra.
Java-da WeakReference nümunəsi:
// hər hansı bir obyekt
Student student = new Student();
// zəif link ona
WeakReference
weakStudent = new WeakReference
(student); // artıq Student obyekti zibil toplayıcısı tərəfindən toplanabilir student = null;
Java-da SoftReference nümunəsi:
// hər hansı bir obyekt
Student student = new Student();
// zəif link ona
SoftReference
softStudent = new SoftReference
(student) // artıq Student obyekti zibil toplayıcısı tərəfindən toplanabilir // amma bu yalnız JVM-in yaddaşa ciddi ehtiyacı olduqda baş verəcək student = null;
8.3 Java-da PhantomReference Linki
PhantomReference nümunəsi, WeakReference və SoftReference misalları kimi eyni şəkildə yaradılır, lakin o, kifayət qədər nadir hallarda istifadə olunur.
PhantomReference zibil toplayıcısı tərəfindən bir obyekt güclü (Strong), zəif (WeakReference) və ya yumşaq linklər (SoftReference) olmadıqda toplanabilir.
Siz Phantom Reference obyektini aşağıdakı kimi yarada bilərsiniz:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference, finalize() istifadəsinin mənalı olmadığı vəziyyətlərdə istifadə edilə bilər. Bu link tipi digər növlərdən fərqlənir, çünki obyektə girməyi nəzərdə tutmur. Bu, obyektin artıq finalize edildiyinə və zibil toplayıcının yaddaşı geri qaytarmağa hazır olduğuna dair bir işarədir.
Bunun üçün zibil toplayıcı onu xüsusi ReferenceQueue-ya sonrakı işlənmə üçün yerləşdirir. ReferenceQueue - obyektlərin yaddaşının azad edilməsinə istinad edən linklərin yığıldığı yerdir.
Fantom linklər - obyektin yaddaşdan silindiyini öyrənməyin təhlükəsiz bir yoludur. Məsələn, böyük şəkillərlə işləyən bir tətbiqi nəzərdən keçirək. Tutaq ki, biz şəkili yaddaşa yükləmək istəyirik, lakin o, artıq zibil toplayıcı üçün hazır olan yaddaşdadır. Bu halda, biz köhnə şəkili zibil toplayıcı öldürdüyü qədər gözləmək istəyirik və yalnız sonra yeni şəkili yaddaşa yükləməyə çalışırıq.
Burada PhantomReference elastik və təhlükəsiz seçimdir. Köhnə şəkilin linki, köhnə şəkil obyektinin məhv edilməsindən sonra ReferenceQueue-ya göndəriləcək. Bu linki əldə etdikdən sonra biz yeni şəkili yaddaşa yükləyə bilərik.
GO TO FULL VERSION