Modul 2 Lesson 7

Modul 2 Lesson 7

Asrorbek

Java’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.
  • new operatori 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

  • native kalit so‘zi bilan yozilgan Java’dan tashqaridagi (masalan, C/C++) funksiyalarni chaqirish uchun ishlatiladi.

🏁 Asosiy Xotiralar:

Quyidagilar Java dasturlarida asosiy xotira komponentlari hisoblanadi:

  1. Heap
  2. Stack
  3. 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, StackOverflowError yuz 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:

  1. Young Generation (Nursery Space)
  2. Eden Space
  3. Survivor Spaces (S0, S1)
  4. 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:

  1. Primitive Parameter
  2. int, double, boolean kabi oddiy turlar.
  3. Passing by value ishlatiladi.
  4. Reference Parameter
  5. Array, Object, String kabi obyektlar.
  6. Java-da reference qiymati by value uzatiladi (bu muhim!).
  7. Variable Arguments (Varargs)
  8. Belgisiz sonli argumentlar uzatishga imkon beradi.
  9. 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.


Report Page