JavaRush /Java блогу /Random-KY /Javaдагы таштанды жыйноочу жөнүндө көбүрөөк маалымат

Javaдагы таштанды жыйноочу жөнүндө көбүрөөк маалымат

Группада жарыяланган
Салам! Акыркы лекцияда биз алгач Java тorнин орнотулган механизми – таштанды жыйноочу менен тааныштык. Ал сиздин программаңыз иштеп жатканда фондо иштейт, керексиз болуп калган an objectтерди чогултат, алар кийинчерээк жок кылынат. Ошентип, ал келечекте жаңы an objectтерди түзүү үчүн эстутумду бошотот. Бул лекцияда биз анын иштөө принцибине тереңирээк токтолобуз. Мисалы, an object кантип жана кайсы учурда керексиз болуп калат? Жана таштанды жыйноочу бул тууралуу кайдан билет? Биз бул суроолорго жооп беребиз :) Биздин лекция көбүрөөк баяндама: бул материалды жаттап алуунун кереги жок. Бул эс тутум жана таштанды жыйноочу иш боюнча көз карашыңызды кеңейтүү үчүн арналган, андыктан аны окуп, өзүңүз үчүн жаңы нерсени үйрөнүү жетиштүү болот :) Кеттик! Эсиңизде болсун, таштанды жыйноочу программаңыз менен параллелдүү иштейт . Ал анын курамына кирбейт жана өзүнчө иштейт: муну сүрөттөш үчүн, акыркы лекцияда биз робот чаң соргучка окшоштук келтирдик. Чынында, бул дайыма эле болгон эмес. Мурда таштанды жыйноочу программаңыз менен бир жипте иштегендей иштелип чыккан. Ал эми кандайдыр бир графикке ылайык, бир нече мүнөт сайын, ал программада керексиз an objectилердин бар-жоктугун текшере баштады. Көйгөй бул текшерүү жана таштанды чогултуу учурунда программа катып калып, аткарылбай калган. Элестетиңиз, сиз кеңседе отуруп иштеп жатасыз. Бирок андан кийин тазалоочу айым келип, бөлмөнүн полдорун жууш керек. Ал сени 5 мүнөткө компьютердин артынан кууп чыгат, сен ал тазалап бүткүчө күтөсүң. Бул убакыттын ичинде сиз иштей албайсыз. Мурда таштанды жыйноочулар болжол менен ушундай иштешчү :) Кийинчерээк бул механизм өзгөртүлүп, азыр таштанды жыйноочу программанын ишин жайлатпай, фондо иштейт. Сиз буга чейин эч кандай шилтемелер калган an object өлөт деп билесиз. Бирок таштанды жыйноочу шилтемелерди эсептебейт . Биринчиден, ал абдан узун болушу мүмкүн. Экинчиден, бул абдан натыйжалуу эмес. Анткени, an objectтер бири-бирине кайрыла алат! Таштанды жыйноочу жөнүндө көбүрөөк - 2Сүрөттө 3 an object бири-бирине шилтеме кылган мисал көрсөтүлгөн, бирок башка эч ким аларга кайрылbyte. Башкача айтканда, программанын калган бөлүгү иштеши үчүн алар керек эмес. Эгерде таштанды жыйноочу жөн эле шилтемелерди санаса, бул 3 an objectтин баары калып, эстутумду бошотпойт: аларга шилтемелер бар! Аны космостук кемеге салыштырууга болот. Учуу учурунда космонавттар оңдоого керектелүүчү запастык бөлүктөрдүн тизмесин текшерүүнү чечип, алардын арасынан руль менен катардагы машинанын педалдарын табышкан. Алар бул жерде так керек эмес жана кошумча орун ээлейт. Бул бөлүктөрү туташкан жана кээ бир милдеттери бар болсо да, космостук иш алкагында алар кутулуу үчүн жакшыраак керексиз таштанды болуп саналат. Ошондуктан, Java таштандыларды чогултуу үчүн шилтемелерди санабастан, an objectтерди эки түргө бөлүүнү чечти - жетүүгө мүмкүн жана жетүүгө мүмкүн эмес.. Объекттин жетүүгө болоорун кантип аныктоого болот? Бардык гениалдуу жөнөкөй. Объектке башка жетүүгө мүмкүн болгон an object тарабынан шилтеме кылынса, жеткorктүү болот. Бул "жетилүү чынжырына" алып келет. Ал программа башталганда башталып, анын бүткүл иштөө мөөнөтүндө уланат. Бул төмөнкүдөй көрүнөт: Таштанды жыйноочу жөнүндө көбүрөөк - 4Сүрөттөгү жебе программабыздын аткаруучу codeун көрсөтүп турат. Коддо, мисалы, main() методунда an objectтерге шилтемелер түзүлөт. Бул an objectтер жаңы an objectтерге, айрымдары дагы башка an objectтерге жана башкаларга тиешелүү болушу мүмкүн. Объекттик шилтемелердин чынжырчасы түзүлөт . Эгерде an objectке шилтемелердин бул тизмеги аркылуу “тамыр шилтемесине”, башкача айтканда, түздөн-түз аткаруучу codeдо түзүлгөн an objectке жетүүгө мүмкүн болсо, ал жетүүгө мүмкүн деп эсептелет. Биздин сүрөттө алар көк менен көрсөтүлгөн. Бирок, эгерде an object бул чынжырдан чыгып кетсе, башкача айтканда, учурда аткарылып жаткан codeдун өзгөрмөлөрүнүн биринде да ага шилтемелер жок болсо, ошондой эле ага “шилтемелер чынжырчасы” аркылуу жетүү мүмкүн болбосо – ал жетүүгө мүмкүн эмес деп эсептелет. Биздин программада мындай эки an object кызыл менен көрсөтүлгөн. Көңүл буруңуз: бул "кызыл" an objectилердин бири-бирине шилтемелери бар. Бирок, биз жогоруда айткандай, Java заманбап таштанды жыйноочу шилтемени эсепке алbyte. Бул an objectтин жеткorктүү же жетүүгө мүмкүн эмес экенин аныктайт . Демек, сүрөттөгү эки кызыл нерсе анын олжосу болуп калат. Эми бүт процессти башынан аягына чейин карап көрөлү жана ошол эле учурда Javaда эстутум кандай иштээрин карап көрөлү :) Javaдагы бардык an objectтер үймөк деп аталган атайын эс тутум аймагында сакталат . Жөнөкөй тил менен айтканда, “үймөлөк” – бул бардыгы башаламандыкта жаткан an objectтердин тоосу. Бирок Javaдагы үймөк андай эмес. Бул абдан логикалык жана акылга сыярлык түзүлүшкө ээ. Жакшы күндөрдүн биринде, Java программисттери алардын программаларындагы бардык an objectилерди эки түргө бөлсө болорун табышты - салыштырмалуу айтканда, жөнөкөй an objectтер жана "узак жашоочу" . Көптөгөн таштанды жыйымдарынан аман калган an objectилер "узак жашоо" болуп саналат. Көбүнчө алар программанын аягына чейин бар болот. Натыйжада, бардык түзүлгөн an objectтер сакталган жалпы үймөк бир нече бөлүккө бөлүнгөн. Биринчи бөлүктүн кооз аталышы бар - Эйден (библиялык "Эйден бакчасы"). Бул сонун ат, анткени an objectтер жаралгандан кийин ошол жерге барат. Дал ушул бөлүктө биз жазганда жаңы an objectтер үчүн эс тутум бөлүнөтnew. Көптөгөн an objectтерди түзүүгө болот жана бул аймакта орун түгөнүп калганда, биринчи, "тез" таштанды чогултуу башталат. Таштанды жыйноочу абдан акылдуу жана үймөктө эмне көп экенине жараша иш алгоритмин тандайт - таштандыга же жумушчу an objectтерге. Эгерде дээрлик бардык an objectтер таштанды болсо, коллектор "тирүү" an objectтерди белгилейт жана аларды башка эс тутум аймагына жылдырат, андан кийин учурдагы аймак толугу менен тазаланат. Эгерде таштанды аз болсо жана анын басымдуу бөлүгүн тирүү an objectилер ээлесе, ал таштандыны белгилеп, тазалап, калган an objectилерди иретке келтирет. Биз "коллектор "тирүү" an objectтерди белгилейт жана аларды башка эс тутумуна жылдырат" дедик, бирок кайсынысы? Жок дегенде бир таштанды чогултуудан аман калган бардык an objectтер өткөрүлүп берилген эс тутум аймагы Survival Space деп аталат . Survival Space, өз кезегинде, муундарга бөлүнөт . Ар бир an objectке канча таштанды чогултканына жараша муун ыйгарылат. Эгерде бар болсо, ал "1-Муунга", 5 болсо - "5-Муунга" таандык. Эден жана Survival Space чогуу Жаш муун деп аталган аймакты түзөт . Жаш муундан тышкары үймөктө дагы бир эс тутум чөйрөсү бар - Эски муун («эски муун»). Булар көп таштанды жыйымдарынан аман калган абдан узак an objectтер. Аларды башкалардан өзүнчө сактоо пайдалуураак. Ал эми Эски муун аймагы толгондо гана, б.а. Жада калса, программада өтө көп узак мөөнөттүү an objectтер болгондуктан, эстутум жетишсиз, таштандыларды толугу менен чогултуу аткарылат. Ал бир эле эстутум аймагын эмес, жалпысынан Java машинасы тарабынан түзүлгөн бардык an objectтерди иштетет. Албетте, бул көбүрөөк убакыт жана ресурстарды талап кылат. Ошондуктан көпкө сакталган an objectилерди өзүнчө сактоо чечими кабыл алынган. Башка аймактарда орун түгөнүп калганда «тез арада таштанды чыгаруу» жүргүзүлөт. Ал бир гана аймакты камтыйт жана ушундан улам үнөмдүү жана ылдамыраак. Акыр-аягы, ал тургай, жүз жылдыктар үчүн аймак мурунтан эле бүтүп калганда, толук тазалоо күрөшкө кирет. Ошентип, эң «оор» куралды монтаждоочу анын кереги жок болгондо гана колдонот. Схемалык түрдө, үймөктүн жана тазалоонун түзүлүшү мындай көрүнөт: Таштанды жыйноочу жөнүндө көбүрөөк - 5
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION