Sobes.tech
Middle

Povězte o zásobníku volání a haldě v kontextu práce s Android aplikacemi.

sobes.tech AI

Odpověď od AI

Volání zásobník je oblast paměti používaná k dočasnému ukládání informací souvisejících s voláními funkcí/metod. Každé volání vytváří rámec (Stack Frame), který obsahuje:

  • Lokální proměnné.
  • Argumenty metody.
  • Adresu návratu.

Rámce jsou přidávány na zásobník podle principu LIFO (Last-In, First-Out). Když metoda skončí, její rámec je odstraněn ze zásobníku.

Heap (halda) je oblast paměti používaná pro dynamickou alokaci objektů. Objekty jsou vytvářeny pomocí operátoru new a zůstávají živé, dokud na ně existují odkazy. Pokud odkazů není, stávají se kandidáty na sběr odpadu (Garbage Collection).

Hlavní rozdíly:

Charakteristika Volací zásobník Halda
Délka života Krátká (do ukončení metody) Dlouhá (dokud existují odkazy)
Alokace paměti Automatická Dynamická (new)
Uvolnění paměti Automatické (po ukončení metody) Sběr odpadu
Velikost Omezená, předdefinovaná Flexibilní, závisí na dostupné paměti
Typ dat Primitivní typy, odkazy na objekty Objekty

V Androidu má každý vlákno svůj vlastní volací zásobník, zatímco halda je sdílená mezi všemi vlákny aplikace. Přetečení zásobníku (StackOverflowError) nastává při příliš hluboké rekurzi nebo vytváření příliš velkého množství lokálních proměnných. Nedostatek paměti v haldě (OutOfMemoryError) nastává při pokusu alokovat objekt, když v haldě není dostatek volného místa.

// Příklad použití zásobníku a haldy

public class Example {
    private int instanceVariable; // V haldě jako součást objektu

    public void someMethod(int parameter) { // parameter - na zásobníku
        int localVariable = 10; // localVariable - na zásobníku

        // Objekt je vytvořen v haldě
        MyObject obj = new MyObject(); // obj (odkaz) - na zásobníku, samotný objekt - v haldě

        obj.doSomething(localVariable); // localVariable je předána hodnotou do nového rámce na zásobníku
    }

    private class MyObject {
        public void doSomething(int value) { // value - na zásobníku metody doSomething
            // Vnořená metoda, přidává nový rámec na zásobník
            anotherMethod();
        }
    }

    private void anotherMethod() {
        // Tato metoda vytváří nový rámec na zásobníku
    }
}