JavaRush /Java blogi /Random-UZ /Java-da zaif, yumshoq, xayoliy va oddiy havolalar o'rtasi...
theGrass
Daraja
Саратов

Java-da zaif, yumshoq, xayoliy va oddiy havolalar o'rtasidagi farqlar

Guruhda nashr etilgan
"Zaif" havolalar va "yumshoq" havolalar (WeakReference, SoftReference) Java API-ga ancha oldin qo'shilgan , ammo har bir dasturchi ular bilan tanish emas. Bu ularni qaerda va qanday ishlatishni tushunishda bo'shliqni ko'rsatadi. Yo'naltiruvchi sinflar axlat yig'ish kontekstida ayniqsa muhimdir . Hammamizga ma'lumki, axlat yig'uvchining o'zi ob'ektlar egallagan xotirani bo'shatadi, ammo hamma dasturchilar ob'ektga mavjud bo'lgan havolalar turiga qarab xotirani bo'shatish to'g'risida qaror qabul qilishini bilishmaydi. SoftReference va WeakReferenceJava-da zaif, yumshoq, xayoliy va oddiy havolalar o'rtasidagi farqlar - 1 o'rtasidagi asosiy farq kollektor ular bilan qanday ishlashidir. U istalgan vaqtda ob'ektni o'chirib tashlashi mumkin, agar faqat zaif havolalar unga ishora qilsa, boshqa tomondan, yumshoq havolaga ega bo'lgan ob'ektlar JVM haqiqatan ham xotiraga muhtoj bo'lganda yig'iladi . Malumot sinflarining bu xususiyatlari tufayli ularning har biri o'z qo'llanilishiga ega. SoftReference keshlarni amalga oshirish uchun ishlatilishi mumkin va JVM xotiraga muhtoj bo'lganda, u bunday ob'ektlarni o'chirish orqali uni bo'shatadi. Va WeakReferences metama'lumotlarni saqlash uchun juda yaxshi, masalan, ClassLoader-ga havolani saqlash. Agar yuklanadigan sinflar bo'lmasa, ClassLoader ga havolani saqlashning ma'nosi yo'q , zaif havola ClassLoaderni Kuchli havola o'rniga tayinlaganimizdan so'ng uni olib tashlash uchun mavjud qiladi. Ushbu maqolada biz havolalar turlari o'rtasidagi farqlarni ko'rib chiqamiz, jumladan Strong reference va Phantom reference .

Java'da WeakReference va SoftReference

Bilmaganlar uchun havolalarning 4 turi mavjud:
  1. Kuchli havola
  2. Zaif havola
  3. Yumshoq havola
  4. Phantom Reference
Kuchli havola eng oddiy hisoblanadi, chunki biz uni har kuni dasturlashda ishlatamiz, masalan, String s = “abc” kabi kodda s o‘zgaruvchisi kuchli havola hisoblanadi. Kuchli havolaga ega bo'lgan har qanday ob'ektni axlat yig'uvchi tomonidan olib tashlash taqiqlanadi. Albatta, bular Java dasturiga kerak bo'lgan ob'ektlardir. Zaif havolalar java.lang.ref.WeakReference klassi bilan ifodalanadi , siz quyidagi kabi zaif havolani belgilashingiz mumkin:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Endi kuchli havola hisoblagichini null (counter = null) ga o'rnatganingizdan so'ng, birinchi qatorda yaratilgan ob'ekt axlat yig'ish uchun mavjud bo'ladi, chunki u endi kuchli havolaga ega emas. Weak tomonidan yaratilgan zayıfCounter ma'lumotnomasi kollektorga Counter ob'ektini o'chirishga to'sqinlik qila olmaydi. Boshqa tomondan, agar u Yumshoq havola bo'lsa, Counter ob'ekti JVM xotiraga ayniqsa yuqori ehtiyoj sezmaguncha o'chirilmaydi . Java tilidagi yumshoq havolalar java.lang.ref.SoftReference sinfi bilan ifodalanadi . Java -da SoftReference yaratish misoli
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
Kuchli havolani tozalagandan so'ng (3-qatorda) Hisoblagich ob'ektida faqat 1 ta yumshoq ma'lumotnoma qoladi, bu axlat yig'uvchining ushbu ob'ektni o'chirishiga to'sqinlik qila olmaydi, lekin zaif havoladan farqli o'laroq, u mumkin bo'ladi. xotiraning keskin tanqisligi paydo bo'lguncha bu jarayonni kechiktirish. Yumshoq havolalar va zaif havolalar o'rtasidagi bu farqni hisobga olsak, birinchisi keshlar uchun ko'proq mos keladi va metadata uchun zaifdir. Yaxshi misol WeakHashMap sinfidir, u HashMap yoki TreeMap sinflari kabi Xarita interfeysining avlodi , lekin bitta o'ziga xos xususiyatga ega. WeakHashMap kalitlarni zaif havolalar sifatida o'rab oladi, ya'ni ob'ektga kuchli havolalar bo'lmasa, WeakHashMap ichida joylashgan zaif havolalar sizni axlat yig'uvchidan qutqarmaydi. Fantom havolalar java.lang.ref paketida mavjud bo'lgan havolalarning uchinchi turidir. Fantom havolalari java.lang.ref.PhantomReference sinfi bilan ifodalanadi . Faqat xayoliy havolalar bilan ko'rsatilgan ob'ektni istalgan vaqtda kollektor o'chirib tashlashi mumkin. Phantom havolasi zaif yoki yumshoq havola bilan bir xil tarzda yaratilgan.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
DigitalCounter ob'ektiga kuchli havolalarni o'chirib tashlaganingizdan so'ng, axlat yig'uvchi uni istalgan vaqtda o'chirib tashlaydi, chunki endi faqat xayoliy havolalar unga ishora qiladi. WeakReference, SoftReference, PhantomReference, WeakHashMap sinflaridan tashqari, ReferenceQueue klassi haqida bilish foydalidir . Siz ushbu sinfdan WeakReference, SoftReference yoki PhantomReference obyektini yaratishda foydalanishingiz mumkin:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Ob'ekt havolasi ReferenceQueue ga qo'shiladi va siz ReferenceQueue so'rovi orqali havolalar holatini kuzatishingiz mumkin. Ob'ektning hayot aylanishi ushbu diagrammada yaxshi tasvirlangan: Java'dagiJava-da zaif, yumshoq, fantom va oddiy havolalar o'rtasidagi farqlar - 2 zaif va yumshoq havolalar o'rtasidagi barcha farqlar shu . Shuningdek, biz fantom havolalar, WeakHashMap sinfi va ReferenceQueue bilan tanishdik . Ma'lumotnomalardan to'g'ri foydalanish axlat yig'ishda yordam beradi va Java'da yanada moslashuvchan xotira boshqaruviga olib keladi . Asl maqola
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION