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.
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:
- heap
- Stack
- Code
- 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.
Variabeln x i m1 skapas ocksรฅ i ramen fรถr m1 pรฅ stacken, som visas i bilden nedan.
Metod m1 anropar sedan metod m2. I stacken skapas en ny ram fรถr m2 ovanpรฅ ramen fรถr m1.
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.
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.
Referensvariabeln ref skapas pรฅ stacken inuti ramen fรถr m3.
Tilldelningsoperatorn fรฅr referensvariabeln att peka pรฅ objektet pรฅ heapen.
Nรคr metoden har kรถrts รฅtergรฅr kontrollen till den anropande metoden, som i det hรคr fallet รคr metod m2.
Ramen fรถr metod m3 spolas ut ur stacken.
Eftersom referensvariabeln inte lรคngre pekar pรฅ objektet pรฅ heapen blir det objektet berรคttigat till skrรคpinsamling.
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.
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.
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.
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.
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.
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.



















