Sobes.tech
Middle

Android ilovalari ishida chaqirish steki va yotqizish haqida gapiring.

sobes.tech AI

AIdan javob

Qo'ng'iroq yoyi - bu funksiya/method chaqiruvlari bilan bog'liq ma'lumotlarni vaqtincha saqlash uchun ishlatiladigan xotira hududi. Har bir chaqiruv quyidagi elementlarni o'z ichiga olgan (Stack Frame) ramka yaratadi:

  • Mahalliy o'zgaruvchilar.
  • Method argumentlari.
  • Qaytish manzili.

Ramkalar LIFO (Last-In, First-Out) tamoyili bo'yicha yigilishga qo'shiladi. Method tugagach, uning ramkasi yigilishdan olib tashlanadi.

Heap (yig'ish) - bu ob'ektlarni dinamik tarzda ajratish uchun ishlatiladigan xotira hududi. Ob'ektlar new operatori yordamida yaratiladi va ular bilan bog'liq bo'lgan referenslar mavjud bo'lsa, yashashda davom etadi. Agar referenslar bo'lmasa, ular axlat yig'ish (Garbage Collection) uchun nomzod bo'lib qoladi.

Asosiy farqlar:

Xususiyat Qo'ng'iroq yoyi Yig'ish
Hayot muddati Qisqa (method tugagach) Uzun (referenslar mavjud bo'lsa)
Xotira ajratish Avtomatik Dinamik (new)
Xotira bo'shatish Avtomatik (method tugagach) Axlat yig'ish
Hajm Cheklangan, oldindan belgilangan Moslashuvchan, mavjud xotira miqdoriga bog'liq
Ma'lumot turi Primitiv turlar, ob'ektga referenslar Ob'ektlar

Androidda, har bir oqim o'zining qo'ng'iroq yoyi bilan, yig'ish esa barcha oqimlar orasida bo'lishadi. Yoyi to'lib qolishi (StackOverflowError) juda chuqur rekursiya yoki juda ko'p mahalliy o'zgaruvchilar yaratish bilan yuzaga keladi. Yig'ishda xotira yetishmasligi (OutOfMemoryError) esa, ob'ektni ajratishga harakat qilganda, bo'sh joy yetishmasligi bilan yuzaga keladi.

// Yoyi va yig'ishdan foydalanish misoli

public class Example {
    private int instanceVariable; // Yig'ishda, ob'ektning bir qismi sifatida

    public void someMethod(int parameter) { // parameter - yoyi
        int localVariable = 10; // localVariable - yoyi

        // Ob'ekt yig'ishda yaratiladi
        MyObject obj = new MyObject(); // obj (referensiya) - yoyi, ob'ekt - yig'ishda

        obj.doSomething(localVariable); // localVariable yangi ramkadagi yoyi orqali qiymat sifatida uzatiladi
    }

    private class MyObject {
        public void doSomething(int value) { // value - doSomething ramkasining yoyi
            // Ichki metod, yangi ramka qo'shadi
            anotherMethod();
        }
    }

    private void anotherMethod() {
        // Bu metod yangi ramka yaratadi
    }
}