JavaRush /Java blogi /Random-UZ /Java-da axlat yig'uvchi haqida ko'proq

Java-da axlat yig'uvchi haqida ko'proq

Guruhda nashr etilgan
Salom! Oxirgi ma'ruzada biz birinchi bo'lib Java tilining o'rnatilgan mexanizmi - axlat yig'uvchi bilan tanishdik. Dasturingiz ishlayotgan vaqtda u fonda ishlaydi, keraksiz bo'lib qolgan, keyinchalik o'chiriladi ob'ektlarni to'playdi. Shunday qilib, u kelajakda yangi ob'ektlar yaratish uchun xotirani bo'shatadi. Ushbu ma'ruzada biz uning ishlash tamoyilini batafsil ko'rib chiqamiz. Masalan, qanday qilib va ​​qaysi nuqtada ob'ekt keraksiz bo'lib qoladi? Va axlat yig'uvchi bu haqda qayerdan biladi? Biz bu savollarga javob beramiz :) Bizning ma'ruzamiz ko'proq umumiy nuqtai nazardan iborat: bu materialni yodlash shart emas. Bu sizning xotira va axlat yig'uvchi ishi bo'yicha dunyoqarashingizni kengaytirish uchun mo'ljallangan, shuning uchun uni o'qish va o'zingiz uchun yangi narsalarni o'rganish kifoya qiladi :) Ketdik! Eslash kerak bo'lgan birinchi narsa, axlat yig'uvchi dasturingiz bilan parallel ravishda ishlaydi . Bu uning bir qismi emas va alohida ishlaydi: buni tasvirlash uchun oxirgi ma'ruzada biz robot changyutgich bilan o'xshashlik keltirdik. Aslida, bu har doim ham shunday emas edi. Ilgari, axlat yig'uvchi dasturingiz bilan bir xil mavzuda ishlaydigan tarzda ishlab chiqilgan. Va ba'zi bir jadvalga ko'ra, bir necha daqiqada bir marta dasturda keraksiz ob'ektlar mavjudligini tekshira boshladi. Muammo shundaki, ushbu tekshirish va axlat yig'ish paytida dastur muzlab qoldi va bajarilmadi. Tasavvur qiling, siz ofisda ishlayapsiz. Ammo keyin farrosh ayol keladi va xonadagi pollarni yuvishi kerak. U sizni kompyuter ortidan 5 daqiqaga haydab chiqaradi va siz u tozalashni tugatguncha kutasiz. Bu vaqt ichida siz ishlay olmaysiz. Ilgari axlat yig'uvchilar taxminan shunday ishlagan :) Keyinchalik bu mexanizm o'zgartirildi va endi axlat yig'uvchi dasturning o'zi ishini sekinlashtirmasdan, fonda ishlaydi. Siz allaqachon ob'ektga havolalar qolmaganda o'lishini bilasiz. Lekin axlat yig'uvchi aslida havolalarni hisobga olmaydi . Birinchidan, bu juda uzoq bo'lishi mumkin. Ikkinchidan, bu juda samarali emas. Axir, ob'ektlar bir-biriga murojaat qilishi mumkin! Axlat yig'uvchi haqida ko'proq ma'lumot - 2Rasmda 3 ta ob'ekt bir-biriga havola qilingan misol ko'rsatilgan, lekin boshqa hech kim ularga havola qilmaydi. Ya'ni, dasturning qolgan qismi ishlashi uchun ular kerak emas. Agar axlat yig'uvchi oddiygina murojaatlarni hisoblagan bo'lsa, bu 3 ta ob'ektning barchasi qoladi va xotirani bo'shatib qo'ymaydi: ularga havolalar mavjud! Uni kosmik kemaga qiyoslash mumkin. Parvoz davomida astronavtlar ta'mirlash uchun ehtiyot qismlar ro'yxatini tekshirishga qaror qilishdi va ular orasidan oddiy avtomobildan rul va pedallar topdilar. Bu erda ular aniq kerak emas va qo'shimcha joy egallaydi. Garchi bu qismlar bir-biriga bog'langan va ba'zi funktsiyalarga ega bo'lsa-da, kosmik kemaning ishlashi doirasida ular keraksiz axlatdir, undan qutulish yaxshiroqdir. Shuning uchun Java axlat yig'ish uchun asos bo'lib, havolalarni hisobga olmaganda, balki ob'ektlarni ikki turga bo'lishga qaror qildi - kirish mumkin bo'lgan va etib bo'lmaydigan.. Ob'ektga erishish mumkinligini qanday aniqlash mumkin? Aqlli hamma narsa oddiy. Ob'ektga boshqa kirish mumkin bo'lgan ob'ekt tomonidan havola qilingan bo'lsa, unga erishish mumkin. Buning natijasida "etishuvchanlik zanjiri" paydo bo'ladi. U dastur boshlanganda boshlanadi va butun ishlash muddati davomida davom etadi. Bu shunday ko'rinadi: Axlat yig'uvchi haqida ko'proq - 4rasmdagi o'q dasturimizning bajaruvchi kodini bildiradi. Kodda, masalan, main() usulida ob'ektlarga havolalar yaratiladi. Bu ob'ektlar yangi ob'ektlarga, yana bir nechta ob'ektlarga va hokazolarga tegishli bo'lishi mumkin. Ob'ekt bog'lanishlar zanjiri hosil bo'ladi . Agar ob'ektga ushbu bog'lanishlar zanjiri orqali "ildiz havolasi", ya'ni bevosita bajaruvchi kodda yaratilgan ob'ektga erishish mumkin bo'lsa, u erishish mumkin deb hisoblanadi. Bizning rasmimizda ular ko'k rangda ko'rsatilgan. Ammo agar ob'ekt ushbu zanjirdan chiqib ketgan bo'lsa, ya'ni hozirda bajarilayotgan koddagi o'zgaruvchilarning hech biri unga havolalarni o'z ichiga olmaydi va "bog'lanishlar zanjiri" orqali unga etib bo'lmaydi - unga erishib bo'lmaydi. Bizning dasturimizda ikkita bunday ob'ekt qizil rang bilan ko'rsatilgan. E'tibor bering: bu "qizil" ob'ektlar bir-biriga bog'langan. Ammo, yuqorida aytib o'tganimizdek, Java-dagi zamonaviy axlat yig'uvchi mos yozuvlar hisoblamaydi. Bu ob'ektga erishish mumkinmi yoki yo'qligini aniqlaydi . Shuning uchun rasmdagi ikkita qizil narsa uning o'ljasiga aylanadi. Endi butun jarayonni boshidan oxirigacha ko'rib chiqamiz va shu bilan birga Java-da xotira qanday ishlashini ko'rib chiqamiz :) Java-dagi barcha ob'ektlar uyma deb nomlangan maxsus xotira maydonida saqlanadi . Oddiy tilda, "uy" - bu hamma narsa chalkash bo'lib yotgan narsalar tog'idir. Ammo Java-dagi to'p bunday emas. Bu juda mantiqiy va oqilona tuzilishga ega. Yaxshi kunlarning birida, Java dasturchilari o'z dasturlaridagi barcha ob'ektlarni ikki turga bo'lish mumkinligini aniqladilar - nisbatan aytganda, oddiy ob'ektlar va "uzoq umr" . "Uzoq umr" ob'ektlari ko'plab axlat to'plamlaridan omon qolgan narsalardir. Ko'pincha ular dasturning oxirigacha mavjud bo'ladi. Natijada, barcha yaratilgan ob'ektlar saqlanadigan umumiy uyum bir necha qismlarga bo'lingan. Birinchi qismning go'zal nomi bor - Adan (Injildagi "Adan bog'i"). Bu ajoyib nom, chunki bu ob'ektlar yaratilgandan keyin ketadigan joy. Aynan shu qismda biz yozish paytida yangi ob'ektlar uchun xotira ajratiladinew. Ko'p ob'ektlar yaratilishi mumkin va bu sohada bo'sh joy tugasa, birinchi, "tez" axlat yig'ish boshlanadi. Aytish kerakki, axlat yig'uvchi juda aqlli va u erda nima ko'proq - axlat yoki ishlaydigan narsalarga qarab ish algoritmini tanlaydi. Agar deyarli barcha ob'ektlar axlat bo'lsa, kollektor "jonli" ob'ektlarni belgilaydi va ularni boshqa xotira maydoniga o'tkazadi, shundan so'ng joriy maydon to'liq tozalanadi. Agar ozgina axlat bo'lsa va uning ko'p qismini tirik narsalar egallagan bo'lsa, u axlatni belgilaydi, tozalaydi va qolgan narsalarni tartibga soladi. Biz "kollektor "tirik" ob'ektlarni belgilaydi va ularni boshqa xotira joyiga ko'chiradi" dedik, ammo qaysi biri? Eng kamida bitta axlat to'plamidan omon qolgan barcha ob'ektlar uzatiladigan xotira maydoni Survival Space deb ataladi . Survival Space, o'z navbatida, avlodlarga bo'linadi . Har bir ob'ektga qancha axlat to'plamini boshdan kechirganiga qarab avlod tayinlanadi. Agar mavjud bo'lsa, u "1-avlod" ga, 5 bo'lsa - "5-avlod" ga tegishli. Eden va Survival Space birgalikda Yosh avlod deb nomlangan hududni tashkil qiladi . Yosh avloddan tashqari, uyada yana bir xotira maydoni mavjud - Eski avlod ("eski avlod"). Bu ko'plab axlat to'plamlaridan omon qolgan juda uzoq umr ko'rgan ob'ektlardir. Ularni boshqalardan alohida saqlash foydaliroq. Va faqat Eski avlod maydoni to'lganida, ya'ni. Hatto dasturda juda ko'p uzoq muddatli ob'ektlar mavjud bo'lib, xotira etarli emas, to'liq axlat yig'ish amalga oshiriladi. U faqat bitta xotira maydonini emas, balki Java mashinasi tomonidan yaratilgan barcha ob'ektlarni qayta ishlaydi. Tabiiyki, bu ko'proq vaqt va resurslarni talab qiladi. Shuning uchun uzoq umr ko'radigan narsalarni alohida saqlashga qaror qilindi. Boshqa hududlarda bo'sh joy tugasa, "tezkor axlat yig'ish" amalga oshiriladi. U faqat bitta hududni qamrab oladi va shu tufayli u yanada tejamkor va tezroq. Oxir-oqibat, hatto yuz yilliklar uchun maydon allaqachon tiqilib qolganda, to'liq tozalash kurashga kiradi. Shunday qilib, eng "og'ir" vosita assembler tomonidan faqat kerak bo'lmaganda qo'llaniladi. Sxematik ravishda, yig'ish va tozalashning tuzilishi quyidagicha ko'rinadi: Axlat yig'uvchi haqida ko'proq - 5
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION