Sobes.tech
Middle

Реците о стеку позива и хипу у контексту рада 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() {
        // Овај метод креира нови фрејм у стеку
    }
}