8.1 Java-dagi Zaif Havolalar
Java-da bir qancha turdagi havolalar mavjud.
StrongReference bor — bu biz har kuni yaratadigan oddiy havolalar.
Object object = new Object();//ob'ekt yaratildi
object = null;//endi keraksiz yig'uvchi tomonidan olingan bo'lishi mumkin
Va uchta "maxsus" turdagi havolalar mavjud — SoftReference, WeakReference, PhantomReference. Aslida, barcha turi havolalar orasidagi farq faqat bitta — ular mos yozuvlar qilgan ob'ektlar bilan GC ning xatti-harakatlari. Biz har bir havola turi xususiyatlarini keyinroq batafsil muhokama qilamiz, hozircha quyidagi bilimlar yetarli:
- SoftReference — yumshoq havola, agar GC ob'ekt faqat soft-havolalar zanjiri orqali mavjudligini ko'rsa, u uni xotiradan o'chiradi. Ehtimol.
- WeakReference – zaif havola, agar GC ob'ekt faqat weak-havolalar zanjiri orqali mavjudligini ko'rsa, u uni xotiradan o'chiradi.
- PhantomReference — fantom havola, agar GC ob'ekt faqat phantom-havolalar zanjiri orqali mavjudligini ko'rsa, u uni xotiradan o'chiradi. Bir necha marta GC ishlatgandan keyin.
Shuningdek, havola turlarida ma'lum bir yumshoqlik darajasi bor deb aytish mumkin:
- Oddiy qattiq havola – har qanday ko'rsatmalar turi o'zgaruvchisi. Foydalanilmaguncha keraksiz yig'uvchi tomonidan tozalanmaydi.
- SoftReference. Ob'ekt xotiraning to'liq sarflanishiga sabab bo'lmaydi – OutOfMemoryError yuzaga kelishidan oldin o'chiriladi. Bu erta bo'lishi mumkin, bu keraksiz yig'uvchi realizatsiyasiga bog'liq.
- WeakReference. Yumshoqdan zaifroq. Ob'ektni qayta ishlashni oldini olmaydi, keraksiz yig'uvchi bunday havolalarni e'tiborsiz qoldiradi.
- PhantomReference. Ob'ektni “o'lim oldidan” qayta ishlash uchun ishlatiladi: ob'ekt finallashtirilgandan keyin mavjud, lekin keraksiz yig'uvchi tomonidan tozalanmagancha.
Agar hozircha farqi nima ekanini tushunmasangiz, xavotir olmang, tez orada hammasi o'z joyiga tushadi. Detallar kelgusida bo'ladi.
8.2 WeakReference va SoftReference Java-da
Boshida Java'dagi WeakReference va SoftReference orasidagi farqni ko'rib chiqamiz.
Qisqacha aytganda, agar ob'ekt faqat zaif havolalar orqali ko'rsatilsa, keraksiz yig'uvchi xotirani bo'shatadi. Agar ob'ekt SoftReferences havolalar bilan ko'rsatilsa, xotira JVM xotiraga juda muhtoj bo'lganda bo'shatiladi.
Bu ma'lum bir vaziyatlarda SoftReference ga nisbatan kuchli havoladan ustunlik beradi. Masalan, SoftReference dastur keshi realizatsiyasi uchun ishlatiladi, shuning uchun JVM birinchi navbatda faqat SoftReferences orqali ko'rsatiladigan ob'ektlarni o'chiradi.
WeakReference metadata saqlash uchun juda mos, masalan, ClassLoader-ga havola saqlash uchun. Agar hech qanday klass yuklanmagan bo'lsa, ClassLoader-ga havola qilmaslik kerak. Aynan shuning uchun WeakReference keraksiz yig'uvchi ClassLoader bilan uning so'nggi kuchli havolasi o'chirilgach, o'z ishini bajarishga imkon beradi.
Java-da WeakReference misol:
// qandaydir ob'ekt
Student student = new Student();
// zaif havola
WeakReference
weakStudent = new WeakReference
(student); // endi Student ob'ekti keraksiz yig'uvchi tomonidan o'zlashtirilishi mumkin student = null;
Java'da SoftReference misoli:
// qandaydir ob'ekt
Student student = new Student();
// yumshoq havola
SoftReference
softStudent = new SoftReference
(student) // endi Student ob'ekti keraksiz yig'uvchi tomonidan o'zlashtirilishi mumkin // lekin bu JVM kuchli ehtiyoj sezganda sodir bo'ladi student = null;
8.3 Java-dagi PhantomReference Havolasi
PhantomReference ekzemplari WeakReference va SoftReference misollaridagi kabi yaratiladi, lekin u juda kam foydalaniladi.
PhantomReference keraksiz yig'uvchi tomonidan o'zlashtirilishi mumkin, agar ob'ektga kuchli (Strong), zaif havolalar (WeakReference) yoki yumshoq (SoftReference) havolalar bo'lmasa.
Siz Phantom Reference ob'ektini quyidagicha yaratishingiz mumkin:
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference finalize() ishlatiladigan holatlarda qo'llaniladi. Bu havola turi boshqa turlardan farq qiladi, chunki u ob'ektga kirish uchun mo'ljallanmagan. Bu ob'ekt allaqachon finalizatsiya qilinganligi va keraksiz yig'uvchi xotirani qaytarishga tayyor ekanligini bildiruvchi signal sifatida ishlaydi.
Shu maqsadda keraksiz yig'uvchi uni keyinchalik ishlov berish uchun maxsus ReferenceQueue ga joylashtiradi. ReferenceQueue – ob'ektlarga havolalar joylashtirilgan joy, xotirani bo'shatish uchun.
Fantom havolalar — bu xotiradan ob'ekt o'chirilganligini bilishning xavfsiz usuli. Masalan, katta rasmlar bilan ishlaydigan dastur ko'rib chiqaylik. Faraz qilaylik, rasm xotirada yuklanishini istasak, lekin bu rasm keraksiz yig'uvchi uchun tayyor bo'lganda. Bu holda biz eski rasm o'chirilishini kutishimiz kerak va shundan keyin yangi rasmni xotiraga yuklaymiz.
Bu yerda PhantomReference mos va xavfsiz tanlangan. Eski rasmga havola eski rasm ob'ekti yo'q qilinishi bilan ReferenceQueue ga o'tadi. Ushbu havolani olish bilan biz yangi rasmni xotiraga yuklashimiz mumkin.
GO TO FULL VERSION