Hukommelseshåndtering i Java

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 ind 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 Hukommelsesallokering er opdelt i følgende 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

Tildelingen "="-operatoren vil lave en referencevariabel, der peger på objektet i Heapen.

Java Stack og Heap

Når metoden har afsluttet sin udførelse. Kontrolflowet 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 skyllet ud og ikke længere være tilgængelige til brug.

Ligeledes 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

Hvad er Garbage Collection i Java?

Affaldsopsamling i Java er en proces, hvorved programmerne udfører hukommelsesstyring automatisk. Garbage Collector (GC) finder de ubrugte objekter og sletter dem for at genvinde hukommelsen. I Java, dynamisk hukommelsesallokering af objekter opnås ved hjælp af den nye operator, der bruger noget hukommelse, og hukommelsen forbliver allokeret, indtil der er referencer til brugen af ​​objektet.

Når der ikke er nogen referencer til et objekt, antages det, at det ikke længere er nødvendigt, og den hukommelse, som objektet optager, kan genvindes. Der er ikke noget eksplicit behov for at ødelægge en genstand som Java håndterer deallokeringen automatisk.

Teknikken, der opnår dette, er kendt som Dagrenovation. Programmer, der ikke de-allokerer hukommelse, kan i sidste ende gå ned, når der ikke er nogen hukommelse tilbage i systemet at allokere. Disse programmer siges at have hukommelseslækager. Affaldsindsamling i Java sker automatisk i løbet af programmets levetid, hvilket eliminerer behovet for at deallokere hukommelse og derved undgå hukommelseslækager.

I C-sprog er det programmørens ansvar at de-allokere hukommelse tildelt dynamisk ved hjælp af free()-funktionen. Det er her Java hukommelseshåndteringsledninger.

Bemærk: Alle objekter er oprettet i Heap Sektion af hukommelsen. Mere om dette i en senere tutorial.

Eksempel: At lære affaldsopsamlermekanisme i Java

Trin 1) Kopier følgende kode ind i en editor.

class Student{
int a;
int b;
  public void setData(int c,int d){
    a=c;
    b=d;
  }
  public void showData(){
    System.out.println("Value of a = "+a);
    System.out.println("Value of b = "+b);
  }
  public static void main(String args[]){
    Student s1 = new Student();
    Student s2 = new Student();
    s1.setData(1,2);
    s2.setData(3,4);
    s1.showData();
    s2.showData();
    //Student s3;
    //s3=s2;
    //s3.showData();
    //s2=null;
    //s3.showData();
    //s3=null;
    //s3.showData();
  }
}

Trin 2) Gem, kompilér og kør koden. Som vist i diagrammet oprettes to objekter og to referencevariable.


Garbage Collector Mekanisme

Trin 3) Fjern kommentar linje # 20,21,22. Gem, kompilér og kør koden.

Trin 4) Som vist i diagrammet nedenfor, peger to referencevariabler på det samme objekt.

Garbage Collector Mekanisme

Trin 5) Fjern kommentar linje # 23 & 24. Kompiler, gem og kør koden

Trin 6) Som vist i diagrammet nedenfor bliver s2 null, men s3 peger stadig på objektet og er ikke berettiget til java-skraldeindsamling.

Garbage Collector Mekanisme

Trin 7) Fjern kommentar linje # 25 & 26. Gem, kompilér & kør koden

Trin 8) På dette tidspunkt er der ingen referencer, der peger på objektet og bliver berettiget til affaldsindsamling. Det vil blive fjernet fra hukommelsen, og der er ingen måde at hente det tilbage.

Lær Garbage Collector

Sådan sletter du et objekt i Java?

1) Hvis du ønsker at gøre dit objekt kvalificeret til Garbage Collection, skal du tildele dens referencevariabel til null.

2) Primitive typer er ikke objekter. De kan ikke tildeles null.

Sådan sletter du et objekt i Java

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.