Дар бораи стеки даъват ва хишт дар контексти кори барномаҳои Android гап занед.
sobes.tech AI
Ҷавоб аз AI
Зангозии зангозон — ин минтақаи хотираест, ки барои нигоҳдории муваққатии маълумот, вобаста ба зангозии функсияҳо/методҳо истифода мешавад. Ҳар як зангозӣ як рам (Stack Frame) месозад, ки дар бар мегирад:
- Тағйирёбандаҳои маҳаллӣ.
- Аргументҳои метод.
- Нишондиҳандаи баргашт.
Рамҳо ба рӯйхати зангозӣ дар асоси принсипи LIFO (Last-In, First-Out) илова мешаванд. Вақте ки метод ба анҷом мерасад, рамаш аз рӯйхати зангозӣ хориҷ карда мешавад.
Heap (халта) минтақаи хотираест, ки барои тақсимоти динамикӣ истифода мешавад. Объектҳо бо ёрии оператори new эҷод мешаванд ва то он даме, ки ба онҳо истинодҳо мавҷуд бошанд, зинда мемонанд. Агар истинодҳо набошанд, онҳо ба номзадҳои ҷамъоварии партов (Garbage Collection) табдил меёбанд.
Тавсифи асосӣ:
| Хусусият | Зангозии зангозӣ | Халта |
|---|---|---|
| Вақти зиндагӣ | кӯтоҳ (то анҷоми метод) | дарозмуддат (то он ки истинодҳо бошанд) |
| Таъин кардани хотира | автоматӣ | динамикӣ (new) |
| Барқарорсозӣ | автоматӣ (пас аз анҷоми метод) | ҷамъоварии партов |
| Андозаи | маҳдуд, пешфарзшуда | чандир, вобаста ба хотираи дастрас |
| Навъи додаҳо | намудҳои primitives, истинодҳо ба объектҳо | объектҳо |
Дар Android, ҳар як ҷараён (ток) стек зангозии худро дорад, ва халта байни ҳамаи ҷараёнҳо тақсим шудааст. Пуршавии стек (StackOverflowError) дар натиҷаи рекурсияи хеле амиқ ё эҷоди бисёр тағйирёбандаҳои маҳаллӣ рӯй медиҳад. Норасоии хотира дар халта (OutOfMemoryError) дар натиҷаи кӯшиши тақсимоти объект, вақте ки дар халта ҷойи кофӣ нест.
// Мисоли истифодаи стек ва халта
public class Example {
private int instanceVariable; // дар халта ҳамчун қисми объект ҷойгир аст
public void someMethod(int parameter) { // parameter - дар стек
int localVariable = 10; // localVariable - дар стек
// Объект дар халта эҷод мешавад
MyObject obj = new MyObject(); // obj (истинод) - дар стек, худи объект - дар халта
obj.doSomething(localVariable); // localVariable бо арзиш ба стек рамзи нав интиқол дода мешавад
}
private class MyObject {
public void doSomething(int value) { // value - дар рамзи doSomething
// Методи дохилӣ, рам нави дар стек илова мекунад
anotherMethod();
}
}
private void anotherMethod() {
// Ин метод рам навро дар стек месозад
}
}