Java Stack og Heap: Java Memory Allocation Tutorial

Indholdsfortegnelse:

Anonim

Hvad er Stack Memory?

Stak i java er et afsnit af hukommelsen, der indeholder metoder, lokale variabler og referencevariabler. Der henvises altid til stakhukommelse i sidste-i-første-ud rækkefølge. Lokale variabler oprettes i stakken.

Hvad er Heap Memory?

Heap er et afsnit af hukommelse, der indeholder objekter og kan også indeholde referencevariabler. Instansvariabler oprettes i bunken

Hukommelsesallokering i Java

Hukommelsesallokering i Java er den proces, hvor de virtuelle hukommelsesafsnit er afsat i et program til lagring af variabler og forekomster af strukturer og klasser. Hukommelsen allokeres dog ikke til et objekt ved erklæring, men der oprettes kun en reference. Til hukommelsestildelingen af ​​objektet anvendes en ny () metode, så objektet tildeles altid hukommelse på bunken.

Java Memory Allocation er opdelt i følgende sektioner:

  1. Bunke
  2. Stak
  3. Kode
  4. Statisk

Denne hukommelsesdeling er påkrævet for effektiv styring.

  • Den kode afsnit indeholder din bytecode .
  • Den Stack sektion af hukommelse indeholder fremgangsmåder, lokale variable og referencevariabler.
  • Den Heap afsnit indeholder Objekter (kan også indeholde referencevariabler).
  • Den statiske sektion indeholder statiske data / metoder .

Forskel mellem lokal og instansvariabel

Instansvariabel erklæres inde i en klasse, men ikke inde i en metode

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

Lokal variabel er erklæret inde en fremgangsmåde, der indbefatter metode argumenter .

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

Forskel mellem stak og bunke


Klik her, hvis videoen ikke er tilgængelig

Lad os tage et eksempel for at forstå dette bedre.

Overvej, at din hovedmetode kaldemetode m1

public void m1{int x=20}

I stack java oprettes en ramme ud fra metode m1.

Variablen X i m1 oprettes også i rammen til m1 i stakken. (Se billedet nedenfor).

Metode m1 kaldes metode m2. I stack java oprettes en ny ramme for m2 oven på rammen m1.

Variabel b og c oprettes også i en ramme m2 i en stak.

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

Samme metode m2 kalder metode m3. Igen oprettes en ramme m3 øverst på stakken (se billedet nedenfor).

Lad os sige, at vores metode m3 opretter et objekt til klassen "Konto", som har to forekomster variabelt int p og int q.

Account {Int p;Int q;}

Her er koden til metode m3

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

Erklæringen ny konto () opretter et kontoobjekt i bunke.

Referencevariablen "ref" oprettes i en stack-java.

Tildelingen tildeler en referencevariabel, der peger på objektet i bunken.

Når metoden er gennemført. Strømmen af ​​kontrol vender tilbage til opkaldsmetoden. Hvilket i dette tilfælde er metode m2.

Stakken fra metode m3 skylles ud.

Da referencevariablen ikke længere peger på objektet i bunken, ville den være berettiget til affaldsopsamling.

Når metode m2 har afsluttet sin udførelse. Den bliver poppet ud af stakken, og al dens variabel skylles og er ikke længere tilgængelig til brug.

Ligeledes for metode m1.

Til sidst vender strømmen af ​​kontrol tilbage til startpunktet for programmet. Hvilket normalt er den "vigtigste" metode.

Hvad hvis objekt har en reference som instansvariabel?

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 }

I dette tilfælde oprettes referencevariablen "barn" i bunke, som igen peger på sit objekt, noget som diagrammet vist nedenfor.

Resumé:

  • Når en metode kaldes, oprettes en ramme øverst på stakken.
  • Når en metode er færdig med udførelsen, vender strømmen af ​​kontrol tilbage til den kaldende metode, og dens tilsvarende stabelramme skylles.
  • Lokale variabler oprettes i stakken
  • Instansvariabler oprettes i bunken og er en del af det objekt, de tilhører.
  • Der oprettes referencevariabler i stakken.