Modul 2 Lesson 7
AsrorbekJava’da Memory Management (Xotira boshqaruvi) — dastur ishlayotgan vaqtida obyektlarni samarali tarzda yaratish, saqlash va kerak bo‘lmaganda ularni yo‘q qilish jarayonidir. Bu ishlarni asosan Java Virtual Machine (JVM) avtomatik bajaradi, xususan Garbage Collector yordamida.
🧠 Memory Management
Java’da xotira quyidagi asosiy qismlarga bo‘linadi:

1. Heap Memory (Asosiy xotira)
- Obyektlar va ularning maydonlari shu yerda saqlanadi.
newoperatori orqali yaratilgan barcha obyektlar Heapga joylanadi.- Garbage Collector aynan Heapdagi keraksiz obyektlarni yo‘q qiladi.
2. Stack Memory
- Har bir method call uchun ajratiladi.
- Mahalliy o‘zgaruvchilar, parametrlar va return adreslar shu yerda saqlanadi.
- Stack xotira tez ishlaydi, lekin qisqa muddatli ma’lumotlar uchun.
3. Method Area (MetaSpace)
- Classlar haqida ma’lumotlar (metadata), static fieldlar, methodlar bytecode holatida shu yerda saqlanadi.
- Java 8gacha bu joy PermGen deb yuritilgan, undan keyin MetaSpace ga almashtirilgan.
4. Program Counter Register (PC Register)
- Har bir thread o‘zining PC registeriga ega.
- JVM qaysi bytecode ni bajarayotganini kuzatish uchun ishlatiladi.
5. Native Method Stack
nativekalit so‘zi bilan yozilgan Java’dan tashqaridagi (masalan, C/C++) funksiyalarni chaqirish uchun ishlatiladi.
🏁 Asosiy Xotiralar:
Quyidagilar Java dasturlarida asosiy xotira komponentlari hisoblanadi:
- Heap
- Stack
- Method Area (MetaSpace)
Bu uchta xotira JVM'ning ishlashida asosiy rol o‘ynaydi.
Java’da Stack Memory (Stack xotira) — vaqtinchalik ma’lumotlar (methodlar, ularning parametrlari, lokal o‘zgaruvchilar) saqlanadigan tezkor xotira turidir. Bu xotira har bir thread uchun alohida ajratiladi va tez ishlashi bilan ajralib turadi.
🧩 Stack xotira qanday xotira?
- Stack — LIFO (Last-In, First-Out) printsipi asosida ishlaydi.
- Har bir method chaqirilganda yangi Stack Frame yaratiladi.
- Method tugagach, o‘sha frame xotiradan olib tashlanadi.
🔹 Stack Frame nima?
- Stack Frame — bu method chaqiruvi vaqtida hosil bo‘lgan xotira bloki.
- Har bir frame quyidagilarni o‘z ichiga oladi:
- Method parametrlari
- Lokal o‘zgaruvchilar
- Return address (qayerga qaytish kerakligi)
Misol:
public void foo() {
int a = 10;
bar();
}
public void bar() {
int b = 20;
}
foo() chaqirilsa, u uchun frame yaratiladi. bar() chaqirilsa, yana bitta frame qo‘shiladi.
✅ Stack xotirasining afzalliklari:
- Tez ishlaydi – Harakatlar oddiy push/pop operatsiyalar.
- Threadga tegishli – Har bir thread o‘z stackiga ega, bu esa thread-safe xotirani anglatadi.
- Avtomatik boshqariladi – Stackdan chiqqan method bilan birga, ma’lumotlar ham avtomatik yo‘q qilinadi.
🔁 LIFO nima?
LIFO (Last In, First Out) – bu strukturaviy tartib:
- Eng oxirgi qo‘shilgan element birinchi olinadi.
- Stack xotira aynan shu printsip asosida ishlaydi.
❌ StackOverflow qachon yuzaga keladi?
- Juda chuqur rekursiya bo‘lsa yoki cheksiz method chaqiruvlari bo‘lsa:
public void recur() {
recur();
}
- Har bir
recur()chaqiruvi yangi Stack Frame yaratadi. Ma’lum bir chegara (Stack size) o‘tgach,StackOverflowErroryuz beradi.
Java’da Heap Memory — obyektlar va klass ma’lumotlari (class metadata) saqlanadigan asosiy xotira hududidir. U JVM tomonidan avtomatik boshqariladi va Garbage Collector yordamida tozalanadi.
🔹 Heap qanday qismlardan iborat?
Modern JVM implementatsiyalarida Heap 2 ta asosiy qismga bo‘linadi:
- Young Generation (Nursery Space)
- Eden Space
- Survivor Spaces (S0, S1)
- Old Generation (Tenured Space)
Shuningdek, Heapga yaqin turadigan boshqa hududlar ham mavjud:
- Metaspace (oldingi Java versiyalarida Permanent Generation deb atalgan)
- Method Area (klasslar haqida ma'lumotlar saqlanadigan qism)

🌱 Nursery Space (Young Generation) nima?
- Yangi obyektlar dastlab Nursery (Young) Spaceda yaratiladi.
- Bu qismda 3 ta bo‘linma bor:
- Eden Space: obyektlar dastlab bu yerda paydo bo‘ladi.
- Survivor Space 0 (S0) va Survivor Space 1 (S1): Eden’dagi obyektlar yashab qolsa, bu yerga o‘tkaziladi.
- Garbage Collector (Minor GC) bu hududni tez-tez tozalaydi.

🔍 Nursery Space haqida muhim fikrlar:
- Tez-tez tozalanadi (Minor GC).
- Ko‘p obyektlar qisqa umrga ega (masalan, vaqtinchalik stringlar, listlar).
- Agar obyekt Survivor space’da bir necha GC dan omon o‘tsa, u Tenured Spacega ko‘chiriladi.
🧓 Tenured Space (Old Generation) nima?
- Uzoq umr ko‘radigan obyektlar bu yerga joylashtiriladi.
- Misol: Uzoq vaqt ishlatiladigan singletonlar, keshlar.
- Bu qismni tozalash uchun Major GC (Full GC) chaqiriladi.
- Tozalash jarayoni sekinroq va resurs talab qiladi.
🏛️ Permanent Generation nima?
- Java 7 va undan oldingi versiyalarda mavjud.
- Unda class metadata, constant pool, method info va h.k.lar saqlanardi.
- Bu hudud PermGen Space deb atalardi.
⚠️ Eslatma: Java 8 dan boshlab PermGen bekor qilindi va uning o‘rniga Metaspace kiritildi.
🧠 Metaspace nima?
- Java 8 va undan keyingi versiyalarda joriy etilgan.
- Klasslar metama’lumotlari (metadata) saqlanadi.
- Heap emas, balki native (tashqi) xotirada joylashgan.
- O‘lchami JVM tomonidan dinamik boshqariladi.
📘 Method Area nima?
- JVM’ning mantiyaviy konseptlaridan biri.
- Klasslar, metodlar, konstantalar haqidagi ma’lumotlar shu hududda saqlanadi.
- Real implementatsiyada bu hududga Metaspace yoki PermGen mos keladi.
- Method Area — bu logical part, Metaspace — bu uning fizik implementatsiyasi.
🔸 Method Parameters turlari:
- Primitive Parameter
- int, double, boolean kabi oddiy turlar.
- Passing by value ishlatiladi.
- Reference Parameter
- Array, Object, String kabi obyektlar.
- Java-da reference qiymati by value uzatiladi (bu muhim!).
- Variable Arguments (Varargs)
- Belgisiz sonli argumentlar uzatishga imkon beradi.
methodName(int... numbers)kabi yoziladi.
🔹 Passing by Value nima?
Bu — argument qiymatining nusxasi methodga uzatilishini anglatadi.
🧠 Misol:
void change(int x) {
x = 10;
}
int a = 5;
change(a);
// a hali ham 5 bo‘lib qoladi
Ya’ni method faqat nusxa ustida ishlaydi, original o‘zgarmaydi.
🔹 Passing by Reference nima?
Bu — methodga obyektga olib boruvchi manzil (reference) uzatiladi degani.
Method ichida o‘zgartirish — real obyektga ta’sir qiladi.
❗ Javada passing by reference bormi?
✅ Yo‘q. Java-da Faqat passing by value bor.
Ammo reference obyektning manzili uzatilgani uchun, obyektning ichki qiymatlari o‘zgarishi mumkin.
🧠 Misol:
void modifyList(List<String> list) {
list.add("Java");
}
List<String> myList = new ArrayList<>();
modifyList(myList);
// myList ichiga "Java" qo‘shiladi
Chunki methodga list’ning manzili nusxasi uzatilgan bo‘lsa-da, u orqali asl listga ta’sir qilingan.
🔸 Variable Arguments (Varargs) nima?
Varargs — methodga ixtiyoriy sonli argumentlar uzatishga imkon beradi.
🧠 Misol:
void printNumbers(int... nums) {
for (int n : nums)
System.out.println(n);
}
printNumbers(1, 2, 3);
➡ Bu printNumbers(new int[]{1, 2, 3}) ga teng.
Varargs argument faqat oxirgi parameter bo‘lishi kerak.
♻️ Garbage Collector (GC) nima va uning vazifasi?
Garbage Collector — bu Java Virtual Machine (JVM) ning xotirani avtomatik boshqaruvchi mexanizmi bo‘lib,
ishlatilmayotgan obyektlarni aniqlab, ularni xotiradan olib tashlaydi.
🎯 Vazifalari:
- Ortiqcha obyektlarni xotiradan tozalash.
- Xotira to‘lib ketmasligi uchun resurslarni boshqarish.
- Dasturchini xotirani qo‘lda boshqarishdan ozod qiladi.
🧠 JVM Garbage Collector qanday bosqichlarni o‘z ichiga oladi?
Garbage Collection quyidagi asosiy bosqichlar orqali ishlaydi:
1. Marking
- JVM — obyektlar orasida yurib chiqib, hali ishlatilayotgan obyektlarni belgilaydi (reachable).
2. Normal Deletion (Sweeping)
- Ishlatilmayotgan (unreachable) obyektlar xotiradan o‘chiriladi.
3. Compacting (Joylarni zichlash)
- Obyektlar orasida bo‘sh joylar paydo bo‘ladi.
- Bu bo‘sh joylar yopishtirib (defragment qilib) joylar optimal holatga keltiriladi.
4. Finalization (Opsional)
- Agar obyekt
finalize()metodini override qilgan bo‘lsa, u GC chaqirishdan oldin ishga tushadi.
🧹 Sweeping turlari qanday?
Sweeping — bu ishlatilmaydigan obyektlarni xotiradan o‘chirish jarayoni.
Sweeping quyidagi uslublarda bo‘ladi:
1. Stop-the-world sweep
- GC vaqtida butun JVM to‘xtaydi.
- Aniqlangan "garbage" obyektlar olib tashlanadi.
- Kamdan-kam, ammo katta tozalashlarda ishlatiladi.
2. Incremental sweep
- Xotira kichik qismlarga bo‘linib, bosqichma-bosqich tozalanadi.
- JVM to‘liq to‘xtamaydi.
- Responsiveness yaxshiroq.
3. Concurrent sweep
- GC boshqa thread’lar bilan bir vaqtda ishlaydi.
- Ishlash samarasi yuqori.
- Yirik dasturlarda tavsiya etiladi.