JavaRush /Java блогы /Random-KK /Java-дағы қоқыс жинағыш туралы толығырақ

Java-дағы қоқыс жинағыш туралы толығырақ

Топта жарияланған
Сәлеметсіз бе! Соңғы лекцияда біз алдымен Java тілінің кіріктірілген механизмі – қоқыс жинаушымен таныстық. Бағдарлама жұмыс істеп тұрған кезде ол фондық режимде жұмыс істейді, қажетсіз болып қалған, кейін жойылатын нысандарды жинайды. Осылайша ол болашақта жаңа нысандар жасау үшін жадты босатады. Бұл дәрісте біз оның жұмыс істеу принципін егжей-тегжейлі қарастырамыз. Мысалы, an object қалай және қай кезде қажетсіз болып қалады? Ал қоқыс жинаушы мұны қайдан біледі? Біз бұл сұрақтарға жауап береміз :) Біздің лекциямыз көбірек шолу: бұл материалды жаттап алудың қажеті жоқ. Бұл жад және қоқыс жинаушы жұмысына қатысты сіздің ой-өрісіңізді кеңейтуге арналған, сондықтан оны оқып, өзіңіз үшін жаңа нәрсені үйрену жеткілікті болады :) Кеттік! Есте сақтау керек бірінші нәрсе - қоқыс жинаушы сіздің бағдарламаңызбен қатар жұмыс істейді . Бұл оның бөлігі емес және бөлек қызмет етеді: мұны сипаттау үшін соңғы дәрісте біз робот шаңсорғышқа ұқсастық бердік. Шындығында, бұл әрқашан болған емес. Бұрын қоқыс жинағыш бағдарламаңыз сияқты бір ағында жұмыс істейтін етіп жасалған. Ал кейбір кестеге сәйкес, бірнеше minutes сайын ол бағдарламада қажет емес нысандардың бар-жоғын тексере бастады. Мәселе мынада болды, бұл тексеру және қоқыс жинау кезінде бағдарлама қатып қалды және орындалмады. Сіз кеңседе жұмыс істеп жатырсыз деп елестетіңіз. Бірақ содан кейін тазалаушы әйел келеді және бөлмедегі едендерді жуу керек. Ол сізді 5 minutesқа компьютердің артынан қуып жібереді, ал сіз оның тазалауын аяқтағанша күтесіз. Осы уақыт ішінде сіз жұмыс істей алмайсыз. Бұрын қоқыс жинаушылар шамамен осылай жұмыс істейтін :) Кейінірек бұл механизм өзгерді, енді қоқыс жинағыш бағдарламаның жұмысын бәсеңдетпей, фондық режимде жұмыс істейді. Сіз an objectінің оған сілтемелер қалмаған кезде өлетінін білесіз. Бірақ қоқыс жинаушы сілтемелерді іс жүзінде есептемейді . Біріншіден, бұл өте ұзақ болуы мүмкін. Екіншіден, бұл өте тиімді емес. Өйткені, нысандар бір-біріне сілтеме жасай алады! Қоқыс жинағыш туралы толығырақ - 2Суретте 3 нысан бір-біріне сілтеме жасайтын, бірақ басқа ешкім оларға сілтеме жасамайтын мысал көрсетілген. Яғни, бағдарламаның қалған бөлігі жұмыс істеуі үшін олар қажет емес. Егер қоқыс жинағыш сілтемелерді ғана санайтын болса, осы 3 нысанның барлығы қалады және жадты босатпайды: оларға сілтемелер бар! Оны ғарыш кемесімен салыстыруға болады. Ұшу кезінде астронавтар жөндеуге арналған қосалқы бөлшектердің тізімін тексеруді ұйғарып, олардың арасынан руль мен қарапайым көліктің педальдарын тапты. Олар мұнда қажет емес және қосымша орын алады. Бұл бөліктер қосылған және кейбір функцияларға ие болса да, ғарыш аппаратының жұмысы аясында олар қажет емес қоқыс болып табылады, одан құтылу жақсы. Сондықтан Java қоқыс жинаудың негізін сілтемелерді санамай, an objectілерді екі түрге - қол жетімді және қол жетімсіз деп бөлуге шешім қабылдады.. Объектінің қол жетімділігін қалай анықтауға болады? Тапқырлардың бәрі қарапайым. Нысан қол жеткізуге болады, егер оған басқа қол жеткізуге болатын нысан сілтеме жасаса. Бұл «қолжетімділік тізбегіне» әкеледі. Ол бағдарлама басталған кезде басталады және оның жұмысының бүкіл ұзақтығы бойы жалғасады. Ол келесідей көрінеді: Қоқыс жинағыш туралы толығырақ - 4суреттегі көрсеткі бағдарламамыздың орындаушы codeын көрсетеді. Кодта, мысалы, main() әдісінде нысандарға сілтемелер жасалады. Бұл нысандар жаңа нысандарға, кейбіреулері басқаларға және т.б. Объектілік байланыстар тізбегі құрылады . Егер нысанға осы сілтемелер тізбегі арқылы «түбірлік сілтемеге», яғни орындаушы codeта тікелей жасалғанға жетуге болатын болса, ол қол жетімді болып саналады. Біздің суретте олар көк түспен көрсетілген. Бірақ егер an object осы тізбектен шығып кетсе, яғни қазіргі уақытта орындалып жатқан codeтағы айнымалылардың ешқайсысында оған сілтемелер болмаса, сонымен қатар оған «сілтемелер тізбегі» арқылы жету мүмкін болмаса - ол қол жетімсіз болып саналады. Біздің бағдарламада осындай екі нысан қызыл түспен көрсетілген. Назар аударыңыз: бұл «қызыл» нысандардың бір-біріне сілтемелері бар. Бірақ, жоғарыда айтқанымыздай, Java-дағы заманауи қоқыс жинағыш анықтамаларды санамайды. Ол нысанның қол жетімді немесе қол жетімсіз екенін анықтайды . Сондықтан суреттегі екі қызыл зат оның олжасына айналады. Енді барлық процесті басынан аяғына дейін қарастырайық, сонымен қатар Java-да жадтың қалай жұмыс істейтінін көрейік :) Java тіліндегі барлық нысандар үйме деп аталатын арнайы жад аймағында сақталады . Кәдімгі тілмен айтқанда, «үйме» - бұл барлық нәрсе шатасып жатқан заттардың тауы. Бірақ Java-дағы үйме олай емес. Оның өте логикалық және ақылға қонымды құрылымы бар. Жақсы күндердің бірінде Java бағдарламашылары өз бағдарламаларындағы барлық нысандарды екі түрге бөлуге болатындығын анықтады - салыстырмалы, қарапайым және «ұзақ өмір сүретін» нысандар . «Ұзақ өмір сүретін» нысандар - бұл көптеген қоқыс жинақтарынан аман қалған нысандар. Көбінесе олар бағдарламаның соңына дейін болады. Нәтижесінде барлық жасалған нысандар сақталатын ортақ үйме бірнеше бөлікке бөлінді. Бірінші бөлімнің әдемі атауы бар - Едем (библиялық «Едем бағы»). Бұл тамаша атау, өйткені бұл жерде нысандар жасалғаннан кейін жүреді. Дәл осы бөлікте біз жазу кезінде жады жаңа an objectілерге бөлінедіnew. Көптеген нысандарды жасауға болады және бұл аймақта бос орын таусылғанда, бірінші, «жылдам» қоқыс жинау басталады. Айта кету керек, қоқыс жинаушы өте ақылды және үйіндіде не көп екеніне байланысты жұмыс алгоритмін таңдайды - қоқыс немесе жұмыс істейтін нысандар. Барлық дерлік нысандар қоқыс болса, коллектор «тірі» нысандарды белгілеп, оларды басқа жад аймағына жылжытады, содан кейін ағымдағы аймақ толығымен тазартылады. Егер қоқыс аз болса және оның көп бөлігін тірі заттар алып жатса, ол қоқысты белгілейді, оны тазартады және қалған заттарды реттейді. Біз «коллектор «тірі» нысандарды белгілеп, оларды басқа жад орнына жылжытады» дедік, бірақ қайсысы? Кем дегенде бір қоқыс жинағынан аман қалған барлық нысандар тасымалданатын жад аймағы Survival Space деп аталады . Өмір сүру кеңістігі, өз кезегінде, ұрпақтарға бөлінеді . Әрбір нысанға қанша қоқыс жинағанына байланысты ұрпақ тағайындалады. Егер бар болса, ол «1-буынға», 5 болса, «5-буынға» жатады. Eden және Survival Space бірге Жас ұрпақ деп аталатын аймақты құрайды . Жас ұрпақтан басқа үйіндіде тағы бір жад аймағы бар - Ескі ұрпақ («ескі ұрпақ»). Бұл көптеген қоқыс жинақтарынан аман қалған өте ұзақ өмір сүретін нысандар. Оларды басқаларынан бөлек сақтау тиімдірек. Ал Ескі ұрпақ аймағы толған кезде ғана, яғни. Тіпті бағдарламада ұзақ өмір сүретін нысандардың көптігі сонша, жады жеткіліксіз, қоқыстарды толығымен жинау орындалады. Ол бір жад аймағын ғана емес, жалпы Java машинасымен жасалған барлық нысандарды өңдейді. Әрине, бұл әлдеқайда көп уақыт пен ресурстарды қажет етеді. Сондықтан ұзақ өмір сүретін нысандарды бөлек сақтау туралы шешім қабылданды. Басқа аймақтарда орын таусылған кезде «тез қоқыс шығару» жүргізіледі. Ол бір ғана аумақты қамтиды, соның арқасында ол үнемді және жылдамырақ. Соңында, тіпті жүзжылдықтарға арналған аймақ бітеліп қалған кезде, толық тазалау күреске кіреді. Осылайша, ең «ауыр» құралды ассемблер қажет болмаған кезде ғана пайдаланады. Схемалық түрде үйме мен тазалаудың құрылымы келесідей көрінеді: Қоқыс жинағыш туралы толығырақ - 5
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION