Реците о стеку позива и хипу у контексту рада Android апликација.
sobes.tech АИ
Одговор од АИ
Стек позива — то је област меморије која се користи за привремено чување информација везаних за позиве функција/метода. Сваки позив ствара фрејм (Stack Frame), који садржи:
- Локалне променљиве.
- Аргументе метода.
- Адресу повратка.
Фрејмови се додају у стек по принципу LIFO (Last-In, First-Out). Када се метод заврши, његов фрејм се уклања из стека.
Куча (Heap) — то је област меморије која се користи за динамичко алоцирање објеката. Објекти се креирају помоћу оператора new и живе докле год постоје референце на њих. Ако нема референци, они постају кандидати за сакупљање смећа (Garbage Collection).
Основне разлике:
| Карактеристика | Стек позива | Куча |
|---|---|---|
| Време живота | Кратко (до завршетка метода) | Дуготрајно (докле постоје референце) |
| Додела меморије | Аутоматски | Динамички (new) |
| Деалокација | Аутоматска (по завршетку метода) | Сакупљање смећа |
| Величина | Ограничена, предодређена | Флексибилна, зависи од доступне меморије |
| Тип података | Примитивни типови, референце на објекте | Објекти |
У Андроид-у, сваки ток има свој посебан стек позива, а куча се дели између свих токова апликације. Прекорачење стека (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() {
// Овај метод креира нови фрејм у стеку
}
}