Java Stack and Heap: Java Memory Allocation Tutorial

Obsah:

Anonim

Co je to Stack Memory?

Stack in java is a part of memory which contains methods, local variables, and reference variables. Paměť zásobníku je vždy odkazována v pořadí Last-In-First-Out. Místní proměnné se vytvářejí v zásobníku.

Co je halda paměti?

Halda je část paměti, která obsahuje objekty a může také obsahovat referenční proměnné. Proměnné instance jsou vytvořeny v haldě

Přidělení paměti v Javě

Alokace paměti v Javě je proces, při kterém jsou sekce virtuální paměti vyčleněny v programu pro ukládání proměnných a instancí struktur a tříd. Paměť však není při deklaraci přidělena objektu, ale je vytvořen pouze odkaz. Pro přidělení paměti objektu se používá metoda new (), takže objektu je vždy přidělena paměť na haldě.

Přidělení paměti Java je rozděleno do následujících částí:

  1. Halda
  2. Zásobník
  3. Kód
  4. Statický

Toto rozdělení paměti je nutné pro jeho efektivní správu.

  • Sekce kódu obsahuje váš bytecode .
  • Stack část paměti obsahuje metody, lokální proměnné, a referenční proměnné.
  • Sekce haldy obsahuje objekty (může také obsahovat referenční proměnné).
  • Statická část obsahuje statická data / metod .

Rozdíl mezi místní a instanční proměnnou

Proměnná instance je deklarována uvnitř třídy, ale ne uvnitř metody

class Student{int num; // num is instance variablepublic void showData{}

Místní proměnná jsou deklarovány uvnitř je vhodnou metodou, včetně způsobu argumentace .

public void sum(int a){int x = int a + 3;// a , x are local variables;}

Rozdíl mezi zásobníkem a hromadou


Pokud video není přístupné, klikněte sem

Vezměme si příklad, abychom tomu lépe porozuměli.

Zvažte, že vaše hlavní metoda volá metodu m1

public void m1{int x=20}

V zásobníku Java bude vytvořen rámec z metody m1.

Proměnná X v m1 bude také vytvořena v rámci pro m1 v zásobníku. (Viz obrázek níže).

Metoda m1 volá metodu m2. V zásobníku Java se vytvoří nový rámeček pro m2 v horní části rámečku m1.

Proměnné bac budou také vytvořeny v rámečku m2 v hromadě.

public void m2(int b){boolean c;}

Stejná metoda m2 volá metodu m3. Znovu se v horní části zásobníku vytvoří rámeček m3 (viz obrázek níže).

Nyní řekněme, že naše metoda m3 vytváří objekt pro třídu „Účet“, která má dvě instance proměnných int p a int q.

Account {Int p;Int q;}

Zde je kód pro metodu m3

public void m3(){Account ref = new Account();// more code}

Výpis new Account () vytvoří haldu objektu účtu.

Referenční proměnná „ref“ bude vytvořena v java zásobníku.

Přiřazení operátor vytvoří referenční proměnnou, která bude ukazovat na objekt v haldě.

Jakmile metoda dokončí své provádění. Tok řízení se vrátí zpět k volací metodě. Což je v tomto případě metoda m2.

Zásobník z metody m3 bude vyprázdněn.

Vzhledem k tomu, že referenční proměnná již nebude směřovat na objekt v haldě, bude způsobilá pro uvolnění paměti.

Jakmile metoda m2 dokončí své provedení. Bude vyskakováno ze zásobníku a všechny jeho proměnné budou vyprázdněny a již nebudou k dispozici pro použití.

Podobně pro metodu m1.

Tok řízení se nakonec vrátí do počátečního bodu programu. Což je obvykle „hlavní“ metoda.

Co když má Object jako proměnnou instance 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 tomto případě bude referenční proměnná "child" vytvořena v haldě, která bude zase ukazovat na svůj objekt, něco jako diagram zobrazený níže.

Souhrn:

  • Při volání metody se v horní části zásobníku vytvoří rámec.
  • Jakmile metoda dokončí provádění, tok řízení se vrátí na volající metodu a její odpovídající rámec zásobníku se vyprázdní.
  • Místní proměnné se vytvářejí v zásobníku
  • Proměnné instance se vytvářejí v haldě a jsou součástí objektu, ke kterému patří.
  • V zásobníku se vytvářejí referenční proměnné.