JavaRush /Kurslar /All lectures for UZ purposes /Obyektlar avlodlaridagi axlat yig'ish

Obyektlar avlodlaridagi axlat yig'ish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Obyektlar avlodlari bilan ishlash

Java axlat yig'uvchilar obyektlarni yoshiga qarab tasniflash imkoniyatiga ega bo'lgan avlodlar bo'yicha axlat yig'ish strategiyasini amalga oshiradilar.

Bunday ehtiyojni (barcha obyektlarni belgilash va siqish) JVMda samarasiz deb atash mumkin. Chunki ko'p sonli obyektlar ajratilgan sari ularning ro'yxati ortadi, bu esa axlat yig'ish vaqtini oshiradi. Ilovalarning empirik tahlili shuni ko'rsatdiki, Java-da ko'pchilik obyektlar qisqa muddatli.

JVMdagi xotira to'plami uchta bo'limga bo'lingan:

Obyektlar avlodlari bilan ishlash

Yangi avlod

Yangi yaratilgan obyektlar yangi avlodda boshlanadi. Yangi avlod keyin ikkita toifaga bo'linadi.

  • Adem makoni — barcha yangi obyektlar bu yerda boshlanadi, ularga boshlang'ich xotira beriladi.
  • Omon qolganlar makonlari (FromSpace va ToSpace) — obyektlar axlat yig'ish siklidan o'tgandan keyin Ademdan bu yerga ko'chiriladi.

Obyektlar yangi avloddan axlatga yig'ilganda, bu kichik axlat yig'ish voqeasi deyiladi.

Adem makoni obyektlar bilan to'ldirilganda, kichik axlat yig'iladi. Barcha o'lik obyektlar o'chiriladi, va barcha tirik obyektlar qolgan ikkita makondan biriga ko'chiriladi. Kichik GC, shuningdek, omon qolganlar makonidagi obyektlarni tekshiradi va ularni boshqa (keyingi) omon qolganlar makoniga ko'chiradi.

Keling, quyidagi ketma-ketlikni misol qilib olaylik.

  1. Ademda har ikkalasi ham (tirik va o'lik) obyektlar mavjud.
  2. Kichik GC sodir bo'ladi — barcha o'lik obyektlar Adamdan o'chiriladi. Barcha tirik obyektlar makon-1 (FromSpace) ga ko'chiriladi. Adem va makon-2 endi bo'sh.
  3. Yangi obyektlar yaratiladi va Ademga qo'shiladi. Ademdagi va makon-1dagi ba'zi obyektlar o'lik holga keladi.
  4. Kichik GC sodir bo'ladi — barcha o'lik obyektlar Adem va makon-1dan o'chiriladi. Barcha tirik obyektlar makon-2 (ToSpace) ga ko'chiriladi. Adem va makon-1 bo'sh.

Shunday qilib, har qanday vaqtda omon qolganlar uchun makonlardan biri doimo bo'sh bo'ladi. Omon qolgan obyektlar omon qolgan makonlarda ko'chirish chegara qiymatiga yetganda, ular katta avlodga o'tadilar.

Yangi avlod hajmini o'rnatish uchun -Xmn flagdan foydalanish mumkin.

Katta avlod

Uzoq vaqt yashayotgan obyektlar (masalan, dasturning ko'p qismi hayot muddati) oxir-oqibatda katta obyektlar – uzoq yashovchilar bo'lishadi. U, shuningdek, standart avlod deb ham aytiladi va uzoq vaqt omon qolgan makonlarda qolgan obyektlarni o'z ichiga oladi.

Obyektning umri uchun chegaraviy qiymati, uni katta avlodga ko'chirilmasdan oldin u qancha axlat yig'ish sikllarini o'tishi kerakligini belgilaydi. Katta avloddan obyektlar axlatga yuborilganda, bu asosiy axlat yig'ish voqeasi deyiladi.

To'plam xotirasining boshlang'ich va maksimal hajmini o'rnatish uchun -Xms va -Xmx flaglardan foydalanish mumkin.

Java avlodlar bo'yicha axlat yig'ishni qo'llaganligi sababli, axlat yig'ish voqealari ko'proq bo'lgan sari obyekt ko'proq to'plamda harakat qiladi. U yangi avlodda boshlanadi va agar yetarli darajada uzoq yashasa, oxir-oqibatda standart avlodda tugaydi.

Obyektlarning makonlar va avlodlar orasida harakatlanishini tushunish uchun quyidagi misolni ko'rib chiqamiz:

Obyekt yaratilganda, u avval yangi avlodning Adem makoniga joylashtiriladi.

Kichik axlat yig'ish sodir bo'lishi bilan, Ademdagi tirik obyektlar FromSpace makoniga ko'chiriladi. Keyingi kichik axlat yig'ish sodir bo'lganda, tirik obyektlar ham Ademdan, ham boshqa makondan ToSpace makoniga ko'chiriladi.

Bu sikl ma'lum miqdorda davom etadi. Agar obyekt bu vaqtdan keyin hali ham “harakatda” bo'lsa, keyingi axlat yig'ish sikli uni katta avlod makoniga ko'chiradi.

Doimiy avlod va meta-makon

Metama'lumotlar, masalan, klasslar va metodlar doimiy avlodda saqlanadi. JVM uni dasturning ishlashi paytida qo'llanilayotgan klasslarga asoslanib to'ldiradi. Qo'llanilmaydigan klasslar doimiy avloddan axlatga o'tishi mumkin.

Doimiy avlodning boshlang'ich va maksimal hajmini o'rnatish uchun -XX:PermGen va -XX:MaxPermGen flaglardan foydalanishingiz mumkin.

Meta-makon

Java 8 versiyasidan boshlab, doimiy avlod (PermGen) makoni o'rniga MetaSpace xotira makoni keldi. Implementatsiya PermGendan farq qiladi — endi bu to'plam makoni avtomatik ravishda o'zgaradi.

Bu PermGen makonining cheklangan hajmi tufayli yuzaga keladigan ilovalarning xotira yetishmovchiligi muammosini bartaraf etadi. Meta-makon xotirasi axlat kabi to'planishi mumkin va qo'llanilmaydigan klasslar avtomatik ravishda tozalanadi, meta-makon maksimal hajmiga yetganda.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION