JavaRush /Курстар /All lectures for KK purposes /Объекттердің ұрпақтарына арналған қоқыс жинау

Объекттердің ұрпақтарына арналған қоқыс жинау

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді

Объекттердің ұрпақтарымен жұмыс жасау

Java қоқыс жинаушылар белгілі бір ұрпақтар қоқысын жинау стратегиясын жүзеге асырады, ол объекттерді жасына қарай жіктей алады.

Барлық объекттерді белгілеу және тығыздау қажеттілігін JVM-де тиімсіз деп атауға болады. Көптеген объекттер бөлінген сайын олардың тізімі артып, қоқыс жинау уақытын арттырады. Қолданбалардың эмпирикалық талдауы көрсеткендей, Java-дағы объекттердің көбісі ұзақ өмір сүрмейді.

JVM-де үйме жад аймағы үш бөлімге бөлінген:

Объекттердің ұрпақтарымен жұмыс жасау

Жас ұрпақ

Жаңадан құрылған объекттер жас ұрпақта басталады. Жас ұрпақ одан әрі екі санатқа бөлінеді.

  • Эдем кеңістігі — барлық жаңа объекттер осында басталады, оларға бастапқы жады бөлінеді.
  • Тірі қалған кеңістіктер (FromSpace және ToSpace) — объекттер Эдемнен қоқыс жинау циклынан өткеннен кейін осында ауыстырылады.

Объекттер жас ұрпақтан қоқысқа жиналған кезде оны кішкентай қоқыс жинау деп атайды.

Эдем кеңістігі объекттермен толған кезде, кішкентай қоқыс жинау орындалады. Барлық өлі объекттер жойылады, ал тірі қалғандар қалған екі кеңістіктің біріне ауыстырылады. Кішкентай GC тірі қалған кеңістіктегі объекттерді де тексеріп, оларды келесі тірі қалған кеңістікке ауыстырады.

Келесі тізбекті мысал ретінде алайық.

  1. Эдемде екі типтегі объекттер бар (тірі және өлі).
  2. Кішкентай GC орындалады — барлық өлі объекттер Эдемнен шығарылады. Барлық тірі объекттер кеңістік-1 (FromSpace) -ке ауыстырылады. Эдем мен кеңістік-2 енді бос.
  3. Жаңа объекттер жасалып, Эдемге қосылады. Эдем мен кеңістік-1-дегі кейбір объекттер өледі.
  4. Кішкентай GC орындалады — барлық өлі объекттер Эдем мен кеңістік-1-ден шығарылады. Барлық тірі объекттер кеңістік-2 (ToSpace) -ке ауыстырылады. Эдем мен кеңістік-1 бос.

Осылайша кез-келген уақытта тірі қалған кеңістіктердің бірі әрқашан бос болады. Тірі қалған объекттер тірі қалған кеңістіктерде белгілі бір шекті деңгейге жеткенде, олар аға ұрпаққа өтеді.

Жас ұрпақтың өлшемін орнату үшін -Xmn флагын қолдануға болады.

Аға ұрпақ

Ұзақ уақыт өмір сүретін объекттер (мысалы, бағдарламаның көп өмірлік кезеңінде) ақырында аға объекттерге айналады – ұзақ өмір сүретіндер. Ол сонымен қатар штаттық ұрпақ ретінде белгілі және тірі қалған кеңістіктерде ұзақ уақыт бойы қалған объекттерді қамтиды.

Объекттің өмір сүру ұзақтығының шекті мәні, ол қоқыс жинау циклдерін қанша рет өтуі керек екенін анықтайды, аға ұрпаққа көшкенге дейін. Объекттер аға ұрпақтан қоқысқа шығарылған кезде оны негізгі қоқыс жинау оқиғасы деп аталады.

Жадының бастапқы және максималды өлшемін орнату үшін -Xms және -Xmx флагтарын қолдануға болады.

Java ұрпақтар бойынша қоқыс жинауды қолданатындықтан, объект неғұрлым көп қоқыс жинау оқиғаларынан өтсе, соғұрлым ол үймедегі жоғарырақ сатыға көтеріледі. Ол жас ұрпақтан басталып, жеткілікті ұзақ өмір сүрсе, штаттық ұрпақта аяқталады.

Объекттердің кеңістіктер мен ұрпақтарды қалай ауыстыратынын түсіну үшін келесі мысалды қарастырайық:

Объект жасалған кезде, алдымен жас ұрпақтың эдем кеңістігіне орналастырылады.

Кішкентай қоқыс жинау орын алғаннан кейін, Эдемнің тірі объекттері FromSpace кеңістігіне ауыстырылады. Келесі кішкентай қоқыс жинау орын алғанда, Эдем мен кеңістіктегі тірі объекттер ToSpace кеңістігіне ауыстырылады.

Бұл цикл белгілі бір рет қайталанады. Егер осы кезеңнен кейін объект әлі де "қызметте" болса, келесі қоқыс жинау циклі оны аға ұрпақ кеңістігіне ауыстырады.

Тұрақты ұрпақ және мета-кеңістік

Класс пен әдістер сияқты метадеректер тұрақты ұрпақта сақталады. JVM оны қолданбада қолданылатын класстар негізінде орындау барысында толтырады. Қолданылмайтын кластар тұрақты ұрпақтан қоқысқа шығарылуы мүмкін.

Тұрақты ұрпақтың бастапқы және максималды мөлшерін орнату үшін -XX:PermGen және -XX:MaxPermGen флагтарын қолдана аласыз.

Мета-кеңістік

Java 8 басталғалы, тұрақты ұрпақ кеңістігі (PermGen) мета-кеңістік жадымен ауыстырылды. Оның жүзеге асырылуы PermGen-ден өзгеше — бұл үйме кеңістігі енді автоматты түрде өзгереді.

Бұл PermGen кеңістігінің үймесіндегі шектеулі өлшеміне байланысты пайда болатын қолданбалардағы жадының жетіспеушілігі мәселесінен аулақ болуға мүмкіндік береді. Мета-кеңістіктің жады қоқысқа жиналуы мүмкін, ал қолданылмайтын кластар мета-кеңістік максималды өлшемге жеткенде автоматты түрде жойылады.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION