Java'da musor yig'ish nima ekanligini eslaymiz
Musor yig'ish — ishlamayotgan obyektlarni yo'q qilish orqali bajarish muhiti o'zi to'lgan xotirani qayta tiklash jarayoni.
Ba'zida dasturchi bekorchi obyektlarni yo'q qilishni unutib qo'yishi mumkin, va unga berilgan xotira bo'shatilmaydi. Tizim xotirasi ortib boradi, va oxir-oqibat u ortiq berilmaydi. Bunday dasturda “xotira oqishi” mavjud bo'ladi.
Pechagacha yetadigan paytda xotira yangi obyektlarni yaratishga yetmaydi va dastur OutOfMemoryError sababli noto'g'ri tugatiladi.
Java'da musor yig'ish — bu Java dasturlari xotirani avtomatik boshqarish jarayoni. Java dasturlari Java virtual mashinasi (JVM)da ishlatiladigan bayt-kodga kompilyatsiya qilinadi.
Java dasturlari JVMda ishlaganda, obyektlar ularga ajratilgan xotira qismi bo'lgan heapda yaratiladi.
Java ilovasi ishlayotgan paytda, unda yangi obyektlar yaratiladi. Bir vaqtda, ba'zi obyektlar endi kerak bo'lmay qoladi. Har qanday vaqt momentida heap xotirasi ikki turdagi obyektlardan iborat ekanligini ayta olamiz.
- Tirik — bu obyektlar ishlatiladi, ularga boshqa joydan murojaat qilingandir.
- O'lik — bu obyektlar endi hech qayerda ishlatilmayapti, ularga murojaat yo'q.
Musor yig'uvchi ushbu ishlatilmayotgan obyektlarni topadi va ularni xotirani bo'shatish uchun yo'q qiladi.
Java'da musor yig'ish — avtomatik jarayon. Dasturchiga obyektlarni aniq belgilash kerak emas.
Har bir JVM musor yig'ishning o'z versiyasini amalga oshirishi mumkin. Ammo yig'uvchi heap xotirasida mavjud obyektlar bilan ishlash uchun standart JVM spetsifikatsiyasiga mos kelishi kerak, ular nedostizhimo obyektlarini belgilash yoki aniqlash va ularni siqish bilan yo'q qilish kerak.
Obyektlarning yetib borishi
Obyektni tirik deb tan olish uchun — faqat murojaatlar mavjud bo'lishi yetarli emas. Chunki, bir o'lik obyekt boshqa o'lik obyektlarga murojaat qilishi mumkin. Shuning uchun obyektga bo'lgan barcha murojaatlar orasida, hech bo'lmasa “tirik” obyektlardan biri bo'lishi kerak.
Musor yig'uvchilar GC Roots (musor yig'ish ildizlari) kontseptsiyasi bilan ishlaydi, tirik va o'lik obyektlarni ajratib olish uchun. Bular 100% tirik obyektlar va ulardan boshqa obyektlarni tiriklashtiradigan murojaatlar ketmoqda va hokazo.
Bunday ildizlar misollari:
- Tizim klass yuklovchisi tomonidan yuklangan klasslar.
- Tirik oqimlar.
- Hozir bajarilayotgan metodning parametrlar va mahalliy o'zgaruvchilar.
- Synchronizatsiya uchun monitor sifatida qo'llaniladigan obyektlar.
- Ba'zi maqsadlar uchun musor yig'uvchidan ushlab turilgan obyektlar.
- Musor yig'uvchi xotiradagi obyektlar grafikini, bu ildizlardan boshlanib boshqalarga murojaatlar bo'ylab ko'rib chiqadi.
Java'da musor yig'ish bosqichlari
Musor yig'ishning standart amalga oshirilishi uch bosqichga ega.
1. Obyektlarni tirik deb markalash
Bu bosqichda musor yig'uvchi (GC) xotiradagi barcha tirik obyektlarni aniqlashi kerak, obyektlar grafini obsurlash orqali.
U obyektga tashrif buyurganda, uni kirish mumkin deb markalaydi va shuning uchun tirik. GC ildizlaridan inobatga olinmaydigan barcha obyektlar musor yig'ish uchun nomzod sifatida qaraladi.
2. O'lik obyektlarni tozalash
Markaz bosqichidan so'ng xotira maydoni yoki tirik (ziyorat qilingan) yoki o'lik (ziyorat qilinmagan) obyektlar bilan band bo'ladi. Tozalash bosqichi ushbu o'lik obyektlarni o'z ichiga olgan xotira qismlarini bo'shatadi.
3. Qolgan obyektlarni xotirada zich joylashtirish
O'lik obyektlar, oldingi bosqichda o'chirilganlar, bir-birlariga yaqin bo'lishi shart emas. Shu bilan, siz fragmentlangan (yarimto'liq) xotira maydonini olish xavfini tug'dirasiz.
Lekin, albatta, buni ko'rib, musor yig'uvchi o'lik obyektlarni o'chirayotgan paytda xotirani zichlash imkoniyati mavjud. Qolganlari heap boshida uzluksiz blokda joylashadi.
Zichlash jarayoni yangi obyektlar uchun xotirani ketma-ket ajratishni osonlashtiradi.

GO TO FULL VERSION