Java Stack and Heap: Java Memory Allocation Tutorial

Hvad er Stack Memory?

Stack in java er en sektion af hukommelsen, som indeholder metoder, lokale variabler og referencevariabler. Der henvises altid til stakhukommelsen i Last-In-First-Out rækkefølge. Lokale variabler oprettes i stakken.

Hvad er Heap Memory?

Heap er en sektion af hukommelsen, som indeholder objekter og kan også indeholde referencevariabler. Forekomstvariabler oprettes i heapen

Hukommelsestildeling i Java

Hukommelsestildeling ind Java er den proces, hvor de virtuelle hukommelsessektioner sættes til side i et program til lagring af variabler og forekomster af strukturer og klasser. Hukommelsen er dog ikke allokeret til et objekt ved erklæringen, men kun en reference oprettes. Til hukommelsesallokering af objektet bruges new() metoden, så objektet er altid tildelt hukommelse på heapen.

Java Memory Allocation er opdelt i following sektioner:

  1. bunke
  2. Stak
  3. Kode
  4. statisk

Denne opdeling af hukommelse er nødvendig for dens effektive styring.

  • kode sektionen indeholder din bytekode.
  • Stak sektion af hukommelsen indeholder metoder, lokale variabler og referencevariable.
  • bunke afsnit indeholder Objekter (kan også indeholde referencevariabler).
  • statisk afsnit indeholder Statiske data/metoder.

Forskellen mellem lokal og instansvariabel

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

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

Lokal variabel er erklæret indvendig a metode inklusiv metode argumenter.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

Forskellen mellem stak og heap

Klik link. hvis videoen ikke er tilgængelig

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

Overvej, at din hovedmetode kalder metode m1

public void m1{
int x=20
}

I stack java vil der blive oprettet en ramme fra metode m1.

Java Stack og Heap

Variablen X i m1 vil også blive oprettet i rammen for m1 i stakken. (Se billedet nedenfor).

Java Stack og Heap

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

Java Stack og Heap

Java Stack og Heap

Variable b og c vil også blive oprettet i en ramme m2 i en stak.

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

Java Stack og Heap

Samme metode m2 kalder metode m3. Igen oprettes en ramme m3 på toppen af ​​stakken (se billedet nedenfor).

Java Stack og Heap

Java Stack og Heap

Lad os nu sige, at vores metode m3 opretter et objekt til klassen "Konto", som har to instanser variabel 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
}

Opgørelsen new Account() vil oprette et kontoobjekt i heap.

Java Stack og Heap

Referencevariablen "ref" vil blive oprettet i en stak java.

Java Stack og Heap

Opgaven "=" operator vil lave en referencevariabel til at pege på objektet i Heapen.

Java Stack og Heap

Når metoden har afsluttet sin udførelse. Kontrolstrømmen vil gå tilbage til opkaldsmetoden. Hvilket i dette tilfælde er metode m2.

Java Stack og Heap

Stakken fra metode m3 vil blive skyllet ud.

Java Stack og Heap

Da referencevariablen ikke længere vil pege på objektet i dyngen, ville den være berettiget til affaldsindsamling.

Java Stack og Heap

Når metode m2 har afsluttet sin udførelse. Det vil blive poppet ud af stakken, og alle dets variable vil blive tømt og ikke længere være tilgængelige til brug.

lignendewise for metode m1.

Til sidst vil kontrolstrømmen vende tilbage til programmets startpunkt. Som normalt er "hovedmetoden".

Hvad hvis objektet har en reference som sin 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 vil referencevariablen "child" blive oprettet i heap, som igen vil pege på sit objekt, noget som diagrammet vist nedenfor.

Java Stack og Heap

Sammendrag:

  • Når en metode kaldes, oprettes en ramme på toppen af ​​stakken.
  • Når en metode har afsluttet eksekveringen, vender kontrolstrømmen tilbage til den kaldende metode, og dens tilsvarende stackramme tømmes.
  • Lokale variabler oprettes i stakken
  • Forekomstvariabler oprettes i heapen og er en del af det objekt, de tilhører.
  • Referencevariabler oprettes i stakken.