Minneshantering i Java

โšก Smart sammanfattning

Minneshantering i Java fรถrklarar hur JVM:n delar upp runtime-minnet i Stack, Heap, Code, och statiska regioner, hur objektreferenser flรถdar under metodanrop, och hur Garbage Collector รฅtertar oรฅtkomliga objekt sรฅ att applikationer fรถrblir stabila och fria frรฅn minneslรคckor.

  • ๐Ÿง  JVM-minneslayout: Java minnet รคr uppdelat i Heap fรถr objekt, Stack fรถr metodramar och lokala variabler, plus dedikerade omrรฅden fรถr bytekod och statisk data.
  • ๐Ÿ“š Stack vs. Heap: Stackramar fรถljer ordningen sist in, fรถrst ut och lagrar primitiver och referenser, medan heapen innehรฅller alla objekt som skapats med den nya operatorn.
  • โ™ป๏ธ Skrรคp samling: Sopsamlaren tracks nรฅbarhet genom referenskedjor och รฅterkrรคver automatiskt minne frรฅn objekt som ingen trรฅd kan nรฅ.
  • โœ… Moderna samlare: Produktionsarbetsbelastningar fรถrlitar sig i allt hรถgre grad pรฅ G1, ZGC och Shenandoah fรถr insamling med lรฅg paus รถver heaps pรฅ flera gigabyte.
  • ๐Ÿงช Praktiskt exempel: En steg-fรถr-steg-genomgรฅng av Student-klassen visar nรคr referenser blir berรคttigade till insamling och hur nollstรคllning av referenser frigรถr det underliggande objektet.

Minneshantering i Java

Vad รคr stackminne i Java?

Stackminne i Java รคr den region i JVM-minnet som lagrar metodframes, lokala variabler och referensvariabler fรถr varje trรฅd. Stacken nรฅs alltid i ordningen sist in, fรถrst ut, sรฅ den senast anropade metoden placeras รถverst, och dess lokala variabler skickas och poppas med framen.

Varje trรฅd i Java Virtuell maskin fรฅr sin egen Stack, vilket hรฅller metodanrop isolerade och trรฅdsรคkra enligt designen. Primitiva lokala vรคrden som int, boolean och double finns direkt inuti framen, medan objektreferenser lagrade pรฅ Stack pekar pรฅ objekt allokerade pรฅ Heap.

Vad รคr Heap Memory i Java?

Heapminne รคr den delade JVM-regionen som innehรฅller alla Java objekt och array som skapats med den nya operatorn, tillsammans med eventuella referensvariabler som tillhรถr dessa objekt som instansfรคlt. Till skillnad frรฅn Stack delas Heap mellan alla trรฅdar, vilket รคr anledningen till att objektรฅtkomst ofta krรคver synkronisering.

Heapen รคr det omrรฅde som Garbage Collector hanterar. Moderna HotSpot JVM:er delar upp Heapen i en Young Generation fรถr kortlivade objekt och en Old Generation fรถr lรฅnglivade objekt, med klassmetadata lagrade i en separat nativ region som kallas Metaspace.

Minnestilldelning in Java

Minnestilldelning in Java รคr den process genom vilken JVM avsรคtter virtuella minnesomrรฅden fรถr variabler och instanser av klasser och strukturer under programkรถrning. Minnet allokeras inte till ett objekt vid deklaration; endast en referens skapas. Den faktiska objektallokeringen sker via new-operatorn, sรฅ varje objekt finns pรฅ heapen.

Ocuco-landskapet Java Minnesallokeringen รคr indelad i fรถljande avsnitt:

  1. heap
  2. Stack
  3. Code
  4. Statisk

Denna minnesdelning krรคvs fรถr effektiv hantering av kรถrtiden.

  • Ocuco-landskapet Code avsnittet innehรฅller din sammanstรคllda bytekod.
  • Ocuco-landskapet Stack sektionsbutiker metoder, lokala variabler och referensvariabler.
  • Ocuco-landskapet heap avsnitt innehรฅller objekt och kan รคven innehรฅlla referensvariabler som hรฅlls som instansfรคlt.
  • Ocuco-landskapet Statisk sektionshรฅllplatser statiska data och statiska metoder delas รถver alla instanser.

Skillnad mellan lokal och instansvariabel

Att fรถrstรฅ var varje typ av variabel finns i JVM:n hjรคlper till att fรถrklara Stack- och Heap-beteendet. instansvariabel fรถrklaras inuti en klass men utanfรถr vilken metod som helst, och den bor pรฅ Hรถgen som en del av sitt objekt.

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

A lokal variabel fรถrklaras inuti en metod, inklusive metodargument, och finns pรฅ stacken inuti den aktiva ramen.

public void sum(int a){

int x = a + 3;

// a, x are local variables

}

Skillnaden mellan Stack och Heap

Stacken och Heapen lรถser olika problem inuti JVM:n. Stacken ger varje trรฅd snabb, deterministisk allokering fรถr kortlivade data kopplade till metodens omfattning, medan Heapen tillhandahรฅller en delad region fรถr lรฅnglivade objekt som vilken trรฅd som helst kan referera till. Den korta videon nedan sammanfattar kontrasten innan genomgรฅngen som fรถljer.

Klicka hรคr. om videon inte รคr tillgรคnglig

Fรถr att se hur Stack och Heap samarbetar, betrakta en huvudmetod som anropar metod m1.

public void m1{
int x = 20;
}

I JVM-stacken skapas en ram fรถr metod m1.

Java Stack och heap

Variabeln x i m1 skapas ocksรฅ i ramen fรถr m1 pรฅ stacken, som visas i bilden nedan.

Java Stack och heap

Metod m1 anropar sedan metod m2. I stacken skapas en ny ram fรถr m2 ovanpรฅ ramen fรถr m1.

Java Stack och heap

Java Stack och heap

De lokala variablerna b och c skapas ocksรฅ inuti ramen fรถr m2 pรฅ stacken.

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

Dรคrefter anropar m2 metoden m3. ร…terigen skapas en ram fรถr m3 hรถgst upp i stacken, som visas nedan.

Java Stack och heap

Java Stack och heap

Sรคg nu att metod m3 skapar ett objekt fรถr klassen Account, vilket har tvรฅ instansvariabler int p och int q.

class Account {
    int p;
    int q;
}

Hรคr รคr koden fรถr metod m3.

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

Satsen new Account() skapar ett objekt av typen Account pรฅ Heapen.

Java Stack och heap

Referensvariabeln ref skapas pรฅ stacken inuti ramen fรถr m3.

Java Stack och heap

Tilldelningsoperatorn fรฅr referensvariabeln att peka pรฅ objektet pรฅ heapen.

Java Stack och heap

Nรคr metoden har kรถrts รฅtergรฅr kontrollen till den anropande metoden, som i det hรคr fallet รคr metod m2.

Java Stack och heap

Ramen fรถr metod m3 spolas ut ur stacken.

Java Stack och heap

Eftersom referensvariabeln inte lรคngre pekar pรฅ objektet pรฅ heapen blir det objektet berรคttigat till skrรคpinsamling.

Java Stack och heap

Nรคr metod m2 รคr klar tas den bort frรฅn stacken och alla dess variabler blir otillgรคngliga. Detsamma hรคnder fรถr metod m1, och sรฅ smรฅningom รฅtergรฅr kontrollen till huvudmetoden.

Vad hรคnder om ett objekt har en annan referens som sin instansvariabel?

public static void main(String args[]) {
    A parent = new A();
    // more code
}
class A {
    B child = new B();
    int e;
}
class B {
    int c;
    int d;
}

I det hรคr fallet finns referensvariabeln barn pรฅ Heap som en del av A-objektet, och pekar i sin tur till sitt eget B-objekt, som visas nedan.

Java Stack och heap

Vad finns Garbage Collection i Java?

Sophรคmtning in Java รคr den process genom vilken JVM utfรถr minneshantering automatiskt. Garbage Collector hittar objekt som inte lรคngre รคr nรฅbara frรฅn nรฅgon live-referens och รฅtertar deras minne. Dynamisk minnesallokering sker via den nya operatorn, och minnet fรถrblir allokerat tills programmet inte lรคngre har nรฅgon referens till objektet.

Nรคr inga referenser finns kvar anses objektet inte lรคngre behรถvas, och det minne det upptar kan รฅtervinnas. Det finns inget uttryckligt behov av att fรถrstรถra ett objekt eftersom Java hanterar avallokeringen automatiskt via Garbage Collector.

Tekniken bakom detta รคr kรคnd som Skrรคp samlingProgram som inte frigรถr minne kraschar sรฅ smรฅningom nรคr det inte finns nรฅgot kvar att allokera. Sรฅdana program sรคgs ha minne lรคcker. Sophรคmtning in Java kรถrs automatiskt under programmets livslรคngd, vilket eliminerar bรถrdan av manuell deallokering och minskar risken fรถr lรคckor.

I C, dรคremot, รคr programmeraren ansvarig fรถr att frigรถra minne som allokeras dynamiskt via funktionen free(). Det รคr hรคr Java minneshantering erbjuder en stark fรถrdel.

Moderna HotSpot JVM:er levererar flera Garbage Collectors som รคr anpassade fรถr olika arbetsbelastningar. Standard G1 Garbage Collector siktar pรฅ balanserad dataflรถdes- och paustider pรฅ heaps med flera gigabyte. ZGC och Shenandoah siktar pรฅ pauser pรฅ under en millisekund pรฅ mycket stora heaps, vilket gรถr dem vidtraceffektiv fรถr latenskรคnsliga tjรคnster. Att vรคlja rรคtt samlare och finjustera storlekarna fรถr den unga generationen, den gamla generationen och metaspace รคr en kรคrnkompetens fรถr Java prestationsarbete.

Obs: Alla objekt skapas i Heap-sektionen av minnet, vilket รคr den region som Garbage Collector hanterar.

Exempel: Att lรคra sig garbage Collector Mechanism i Java

Den hรคr genomgรฅngen visar nรคr referenser blir berรคttigade till sophรคmtning i ett enkelt program.

Steg 1) Kopiera fรถljande kod till 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();
  }
}

Steg 2) Spara, kompilera och kรถr koden. Som visas i diagrammet skapas tvรฅ objekt och tvรฅ referensvariabler.

 Garbage Collector Mekanism

Steg 3) Avkommentera raderna 20, 21 och 22. Spara, kompilera och kรถr koden.

Steg 4) Som visas i diagrammet nedan pekar nu tvรฅ referensvariabler pรฅ samma objekt.

Garbage Collector Mekanism

Steg 5) Avkommentera raderna 23 och 24. Spara, kompilera och kรถr koden.

Steg 6) Som visas nedan blir s2 null, men s3 pekar fortfarande pรฅ objektet, sรฅ objektet รคr รคnnu inte kvalificerat fรถr sophรคmtning.

 Garbage Collector Mekanism

Steg 7) Avkommentera raderna 25 och 26. Spara, kompilera och kรถr koden.

Steg 8) Vid det hรคr laget pekar inga referenser pรฅ objektet, sรฅ det blir kvalificerat fรถr Garbage Collector. Garbage Collector tar bort det frรฅn minnet, och det finns inget sรคtt att hรคmta det.

 Lรคr dig Garbage Collector

Hur man tar bort ett objekt i Java?

Java tillhandahรฅller ingen manuell borttagningsoperator, sรฅ standardmetoden รคr att ta bort alla referenser till objektet sรฅ att Garbage Collector kan รฅterta det.

1) Fรถr att gรถra ett objekt lรคmpligt fรถr Garbage Collection, tilldela varje referensvariabel som pekar pรฅ det till null.

2) Primitiva typer รคr inte objekt, sรฅ de kan inte tilldelas null. Deras lagringsutrymme รฅtervinns automatiskt nรคr den omgivande Stack-ramen poppas upp.

Hur man tar bort ett objekt i Java

Vanliga frรฅgor

Stacken lagrar metodramar, lokala variabler och referenser i ordningen sist in, fรถrst ut per trรฅd. Heapen lagrar alla objekt som skapats med new och delas mellan trรฅdar, vilket รคr anledningen till att Garbage Collector hanterar den.

Garbage Collector anvรคnder referenskedjor frรฅn GC-rรถtter, sรฅsom aktiva trรฅdar och statiska fรคlt. Alla objekt som inte kan nรฅs frรฅn en rot anses vara oรฅtkomliga och blir berรคttigade till รฅterstรคllning under nรคsta insamlingscykel.

Den unga generationen innehรฅller kortlivade objekt i Eden- och Survivor-utrymmena. Den gamla generationen innehรฅller objekt som รถverlever flera samlingar. Metaspace รคr en region i det ursprungliga minnet som lagrar klassmetadata och ersatte den รคldre PermGen i Java 8.

G1 รคr standardinstรคllningen och passar de flesta arbetsbelastningar pรฅ heaps med flera gigabyte. ZGC och Shenandoah riktar in sig pรฅ pauser pรฅ under en millisekund pรฅ mycket stora heaps och รคr bra val fรถr latenskรคnsliga tjรคnster som kรถrs pรฅ Java 17 eller senare.

Sรคtt varje referens som pekar pรฅ objektet till null, eller lรฅt referenserna falla utanfรถr rรคckvidden nรคr deras Stack-ramar รถppnas. Nรคr ingen Live-referens nรฅr objektet รฅtertar Garbage Collector dess Heap-minne.

Ja. AI-drivna finjusteringsverktyg analyserar GC-loggar, allokeringshastigheter och paushistogram fรถr att rekommendera heapstorlekar, samlarflaggor och Young Generation-fรถrhรฅllanden. De fรถrkortar รฅterkopplingsslingan jรคmfรถrt med manuell finjustering, sรคrskilt รถver G1-, ZGC- och Shenandoah-arbetsbelastningar.

AI-baserade observationsplattformar matar in heapdumps och live-mรคtvรคrden, och klustrar sedan kvarhรฅllna objektgrafer fรถr att flagga misstรคnkta klasser och referenskedjor. Detta avslรถjar lรคckkandidater snabbare รคn manuell heapanalys och hjรคlper team att lokalisera grundorsaken i produktionen.

Sammanfatta detta inlรคgg med: