Čo je to zásobníková pamäť?
Zásobník v jave je časť pamäte, ktorá obsahuje metódy, lokálne premenné a referenčné premenné. Na pamäť zásobníka sa vždy odkazuje v poradí Last-In-First-Out. Lokálne premenné sa vytvárajú v zásobníku.
Čo je halda pamäte?
Halda je časť pamäte, ktorá obsahuje objekty a môže obsahovať aj referenčné premenné. Premenné inštancie sa vytvárajú v halde
Alokácia pamäte v Jave
Alokácia pamäte v Jave je proces, v ktorom sú časti virtuálnej pamäte vyčlenené v programe na ukladanie premenných a inštancií štruktúr a tried. Pamäť však nie je alokovaná k objektu pri deklarácii, ale je vytvorená iba referencia. Na alokáciu pamäte objektu sa používa metóda new (), takže objektu sa vždy alokuje pamäť na halde.
Alokácia pamäte Java je rozdelená do nasledujúcich častí:
- Halda
- Stoh
- Zákonníka
- Statický
Toto rozdelenie pamäte je potrebné pre jeho efektívnu správu.
- Sekcia s kódom obsahuje váš bajtkód .
- Stack časť pamäte obsahuje metódy, lokálne premenné, a referenčné premenné.
- Sekcia haldy obsahuje objekty (môže obsahovať aj referenčné premenné).
- Statická časť obsahuje statické dáta / metód .
Rozdiel medzi miestnou a inštančnou premennou
Premenná inštancie je deklarovaná vo vnútri triedy, ale nie vo vnútri metódy
class Student{int num; // num is instance variablepublic void showData{}
Miestne premenná sú deklarované vnútri je vhodnou metódou, vrátane spôsobu argumentácie .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Rozdiel medzi zásobníkom a hromadou
Ak video nie je prístupné, kliknite sem
Zoberme si príklad, aby sme tomu lepšie porozumeli.
Zvážte, že vaša hlavná metóda volania metódy m1
public void m1{int x=20}
V zásobníku Java sa vytvorí rámček z metódy m1.
Premenná X v m1 sa tiež vytvorí v rámci pre m1 v zásobníku. (Pozri obrázok nižšie).
Metóda m1 volá metódu m2. V zásobníku Java sa vytvorí nový rám pre m2 v hornej časti rámu m1.
Premenné b a c sa tiež vytvoria v ráme m2 v stohu.
public void m2(int b){boolean c;}
Rovnaká metóda m2 volá metódu m3. Na hornej časti stohu sa opäť vytvorí rám m3 (pozri obrázok nižšie).
Teraz povedzme, že naša metóda m3 vytvára objekt pre triedu „Účet“, ktorá má dve inštancie premennej int p a int q.
Account {Int p;Int q;}
Tu je kód pre metódu m3
public void m3(){Account ref = new Account();// more code}
Výpis new Account () vytvorí haldu objektu účtu.
Referenčná premenná „ref“ sa vytvorí v zásobníku Java.
Operátor priradenia vytvorí referenčnú premennú, ktorá smeruje na objekt v halde.
Akonáhle metóda dokončí svoje vykonávanie. Tok riadenia sa vráti späť k volacej metóde. Čo je v tomto prípade metóda m2.
Stoh z metódy m3 bude vyprázdnený.
Pretože referenčná premenná už nebude smerovať na objekt v halde, bude vhodná na zhromažďovanie odpadkov.
Akonáhle metóda m2 dokončí svoje vykonávanie. Bude vyskakovacie zo zásobníka a všetky jeho premenné budú vyprázdnené a už nebudú k dispozícii na použitie.
Rovnako pre metódu m1.
Postup riadenia sa nakoniec vráti do počiatočného bodu programu. Čo je zvyčajne „hlavná“ metóda.
Čo ak má objekt ako svoju inštančnú premennú odkaz?
public static void main(String args[]) {A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
V takom prípade bude referenčná premenná „dieťa“ vytvorená v halde, ktorá následne bude smerovať na jej objekt, podobne ako na nasledujúcom obrázku.
Zhrnutie:
- Keď sa zavolá metóda, vytvorí sa rám v hornej časti stohu.
- Akonáhle metóda dokončí vykonávanie, tok riadenia sa vráti k volajúcej metóde a jej zodpovedajúci rámec zásobníka sa vyprázdni.
- Lokálne premenné sa vytvárajú v zásobníku
- Premenné inštancie sa vytvárajú v halde & a sú súčasťou objektu, ku ktorému patria.
- Referenčné premenné sa vytvárajú v zásobníku.