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
}
}