Minnehåndtering i Java

Hva er Stack Memory?

Stack in java er en del av minnet som inneholder metoder, lokale variabler og referansevariabler. Stabelminne refereres alltid til i Sist-inn-først-ut-rekkefølgen. Lokale variabler opprettes i stabelen.

Hva er Heap Memory?

Heap er en del av minnet som inneholder objekter og kan også inneholde referansevariabler. Forekomstvariabler opprettes i heapen.

Minnetildeling inn Java

Minnetildeling inn Java er prosessen der de virtuelle minneseksjonene settes til side i et program for lagring av variabler og forekomster av strukturer og klasser. Minnet blir imidlertid ikke allokert til et objekt ved deklarering, men bare en referanse opprettes. For minneallokering av objektet brukes new()-metoden, slik at objektet alltid tildeles minne på heapen.

Ocuco Java Minnetildeling er delt inn i følgende seksjoner:

  1. heap
  2. Stable
  3. Kode
  4. Statisk

Denne inndelingen av minne er nødvendig for effektiv styring.

  • Ocuco kode delen inneholder din Bytecode.
  • Ocuco Stable del av minnet inneholder metoder, lokale variabler og referansevariabler.
  • Ocuco heap delen inneholder Objekter (kan også inneholde referansevariabler).
  • Ocuco Statisk delen inneholder Statiske data/metoder.

Forskjellen mellom lokal og forekomstvariabel

Forekomstvariabel blir erklært inne i en klasse, men ikke i en metode

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

Lokal variabel er erklært innsiden a metode inkludert metode argumenter.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

Forskjellen mellom Stack og Heap

Klikk her. hvis videoen ikke er tilgjengelig

La oss ta et eksempel for å forstå dette bedre. Tenk på at hovedmetoden kaller metoden m1

public void m1{
int x=20
}

I stack-javaen vil det bli laget en ramme fra metoden m1.

Java Stack og heap

Variabelen X i m1 vil også bli opprettet i rammen for m1 i stabelen. (Se bildet nedenfor).

Java Stack og heap

Metode m1 kaller metode m2. I stack java opprettes en ny ramme for m2 på toppen av rammen m1.

Java Stack og heap

Java Stack og heap

Variable b og c vil også bli opprettet i en ramme m2 i en stabel.

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

Java Stack og heap

Samme metode m2 kaller metode m3. Igjen lages en ramme m3 på toppen av stabelen (se bildet nedenfor).

Java Stack og heap

Java Stack og heap

La oss nå si at metoden vår m3 oppretter et objekt for klassen "Konto", som har to forekomstvariabel int p og int q.

Account {
             Int p;
             Int q;
       }

Her er koden for metode m3

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

Utskriften new Account() vil opprette et kontoobjekt i haug.

Java Stack og heap

Referansevariabelen "ref" vil bli opprettet i en stack-java.

Java Stack og heap

Tildelingen "="-operatoren vil lage en referansevariabel for å peke på objektet i heapen.

Java Stack og heap

Når metoden er fullført. Kontrollflyten vil gå tilbake til anropsmetoden. Som i dette tilfellet er metode m2.

Java Stack og heap

Stabelen fra metode m3 vil spyles ut.

Java Stack og heap

Siden referansevariabelen ikke lenger vil peke til objektet i haugen, vil den være kvalifisert for søppelinnsamling.

Java Stack og heap

Når metoden m2 har fullført utførelsen. Den vil bli spratt ut av stabelen, og alle variablene vil bli tømt og ikke lenger være tilgjengelige for bruk.

Likeledes for metode m1.

Etter hvert vil kontrollflyten gå tilbake til programmets startpunkt. Som vanligvis er "hovedmetoden".

Hva om objektet har en referanse 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 tilfellet vil referansevariabelen "barn" bli opprettet i haug, som igjen vil peke på objektet, noe som diagrammet vist nedenfor.

Java Stack og heap

Hva er Garbage Collection i Java?

Søppeloppsamling i Java er en prosess der programmene utfører minnebehandling automatisk. Garbage Collector (GC) finner de ubrukte gjenstandene og sletter dem for å gjenvinne minnet. I Java, dynamisk minneallokering av objekter oppnås ved å bruke den nye operatoren som bruker noe minne og minnet forblir allokert til det er referanser for bruken av objektet.

Når det ikke er noen referanser til et objekt, antas det at det ikke lenger er nødvendig, og minnet som er okkupert av objektet kan gjenvinnes. Det er ikke noe eksplisitt behov for å ødelegge et objekt som Java håndterer deallokeringen automatisk.

Teknikken som oppnår dette er kjent som Søppelsamling. Programmer som ikke de-allokerer minne kan til slutt krasje når det ikke er noe minne igjen i systemet å tildele. Disse programmene sies å ha minnelekkasjer. Søppelhenting inn Java skjer automatisk i løpet av programmets levetid, og eliminerer behovet for å deallokere minne og dermed unngå minnelekkasjer.

I C-språket er det programmererens ansvar å de-allokere minne som er tildelt dynamisk ved hjelp av free()-funksjonen. Det er her Java minnehåndteringsledninger.

OBS: Alle objekter er opprettet i heap-delen av minnet. Mer om dette i en senere opplæring.

Eksempel: Å lære søppeloppsamlermekanismen i Java

Trinn 1) Kopier følgende kode inn 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();
  }
}

Trinn 2) Lagre, kompiler og kjør koden. Som vist i diagrammet opprettes to objekter og to referansevariabler.


Søppelsamlermekanisme

Trinn 3) Ikke kommenter linje # 20,21,22. Lagre, kompiler og kjør koden.

Trinn 4) Som vist i diagrammet nedenfor, peker to referansevariabler til samme objekt.

Søppelsamlermekanisme

Trinn 5) Fjern kommenter linje 23 og 24. Kompiler, lagre og kjør koden

Trinn 6) Som vist i diagrammet nedenfor, blir s2 null, men s3 peker fortsatt til objektet og er ikke kvalifisert for java søppelinnsamling.

Søppelsamlermekanisme

Trinn 7) Fjern kommentar linje 25 og 26. Lagre, kompiler og kjør koden

Trinn 8) På dette tidspunktet er det ingen referanser som peker på objektet og blir kvalifisert for søppelhenting. Det vil bli fjernet fra minnet, og det er ingen måte å hente det tilbake.

Lær Garbage Collector

Hvordan slette et objekt i Java?

1) Hvis du ønsker å gjøre objektet ditt kvalifisert for Garbage Collection, tilordne dets referansevariabel til null.

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

Hvordan slette et objekt i Java

Sammendrag:

  • Når en metode kalles, opprettes en ramme på toppen av stabelen.
  • Når en metode har fullført utførelse, går kontrollflyten tilbake til anropsmetoden og dens korresponderende stabelramme tømmes.
  • Lokale variabler opprettes i stabelen
  • Forekomstvariabler opprettes i heapen og er en del av objektet de tilhører.
  • Referansevariabler opprettes i stabelen.