|
-savol. Kuchli, zaif, yumshoq va xayoliy havolalar va ularning axlat yig'ishdagi rolini tasvirlab bering
|
bet | 5/6 | Sana | 10.09.2024 | Hajmi | 37,35 Kb. | | #270822 |
Bog'liq Memory Management in Java Interview Questions ( Answers)12-savol. Kuchli, zaif, yumshoq va xayoliy havolalar va ularning axlat yig'ishdagi rolini tasvirlab bering.
Java-da xotira qanchalik boshqarilsa, muhandis muhim ilovalarda kechikishni minimallashtirish va o'tkazish qobiliyatini maksimal darajada oshirish uchun iloji boricha ko'proq optimallashtirishni amalga oshirishi kerak bo'lishi mumkin. JVMda axlat yig'ish qachon ishga tushirilishini aniq nazorat qilishning iloji bo'lmaganidek , biz yaratgan ob'ektlarga nisbatan uning qanday sodir bo'lishiga ta'sir qilish mumkin.
Java biz yaratgan ob'ektlar va axlat yig'uvchi o'rtasidagi munosabatni nazorat qilish uchun bizga mos yozuvlar ob'ektlari bilan ta'minlaydi.
Odatiy bo'lib, biz Java dasturida yaratgan har bir ob'ektga o'zgaruvchi tomonidan qattiq havola qilinadi:
StringBuilder sb = new StringBuilder();
Yuqoridagi parchada new kalit so'zi yangi StringBuilder ob'ektini yaratadi va uni uyada saqlaydi. Keyin sb o'zgaruvchisi ushbu ob'ektga kuchli havolani saqlaydi . Bu axlat yig'uvchi uchun nimani anglatadi, sb tomonidan berilgan kuchli havola tufayli, alohida StringBuilder ob'ekti umuman yig'ish uchun mos emas . Hikoya faqat sb ni bekor qilganda o'zgaradi :
sb = null;
Yuqoridagi qatorga qo'ng'iroq qilgandan so'ng, ob'ekt yig'ish uchun mos bo'ladi.
Ob'ekt va axlat yig'uvchi o'rtasidagi bu munosabatni java.lang.ref paketi ichida joylashgan boshqa mos yozuvlar ob'ektiga aniq o'rash orqali o'zgartirishimiz mumkin .
Yuqoridagi ob'ektga quyidagi kabi yumshoq havola yaratilishi mumkin :
StringBuilder sb = new StringBuilder();
SoftReference sbRef = new SoftReference<>(sb);
sb = null;
Yuqoridagi parchada biz StringBuilder obyektiga ikkita havola yaratdik . Birinchi qator kuchli mos yozuvlar sb yaratadi va ikkinchi qator yumshoq mos yozuvlar sbRef yaratadi . Uchinchi qator ob'ektni yig'ish uchun yaroqli qilishi kerak, ammo axlat yig'uvchi sbRef tufayli uni yig'ishni keyinga qoldiradi .
Hikoya faqat xotira qattiqlashganda va JVM OutOfMemory xatosini chiqarish yoqasida bo'lganda o'zgaradi . Boshqacha qilib aytganda, faqat yumshoq havolalarga ega bo'lgan ob'ektlar xotirani tiklash uchun oxirgi chora sifatida yig'iladi.
Zaif havolani xuddi shunday tarzda WeakReference klassi yordamida yaratish mumkin. Agar sb null qiymatiga o'rnatilgan bo'lsa va StringBuilder ob'ekti faqat zaif havolaga ega bo'lsa, JVM axlat yig'uvchisi mutlaqo hech qanday kelishuvga ega bo'lmaydi va darhol keyingi tsiklda ob'ektni yig'adi.
Fantom ma'lumotnomasi zaif havolaga o'xshaydi va faqat fantom havolalari bo'lgan ob'ekt kutmasdan yig'iladi. Biroq, xayoliy havolalar, ularning ob'ektlari yig'ilishi bilanoq navbatga qo'yiladi. Ob'ekt qachon yig'ilganligini aniq bilish uchun biz mos yozuvlar navbatini so'rashimiz mumkin.
|
| |