Minneshantering i Java
Vad är Stack Memory?
Stack i java är en del av minnet som innehåller metoder, lokala variabler och referensvariabler. Stackminne refereras alltid i Sist-in-först-ut-ordning. Lokala variabler skapas i stacken.
Vad är Heap Memory?
Heap är en del av minnet som innehåller objekt och kan även innehålla referensvariabler. Instansvariabler skapas i heapen.
Minnestilldelning in Java
Minnestilldelning in Java är den process där de virtuella minnessektionerna sätts åt sidan i ett program för att lagra variabler och instanser av strukturer och klasser. Minnet tilldelas dock inte ett objekt vid deklaration utan endast en referens skapas. För minnesallokeringen av objektet används metoden new(), så att objektet alltid tilldelas minne på högen.
Smakämnen Java Minnestilldelning är uppdelad i följande avsnitt:
- heap
- Stack
- Koda
- Statisk
Denna uppdelning av minne krävs för dess effektiva hantering.
- Smakämnen koda avsnittet innehåller din bytekod.
- Smakämnen Stack minnesdelen innehåller metoder, lokala variabler och referensvariabler.
- Smakämnen heap avsnitt innehåller Objekt (kan även innehålla referensvariabler).
- Smakämnen Statisk avsnitt innehåller Statiska data/metoder.
Skillnad mellan lokal och instansvariabel
Instansvariabel förklaras inuti en klass men inte i en metod
class Student{ int num; // num is instance variable public void showData{}
Lokal variabel är deklarerade inuti a metod inklusive metod argument.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Skillnaden mellan Stack och Heap
Klicka här. om videon inte är tillgänglig
Låt oss ta ett exempel för att förstå detta bättre. Tänk på att din huvudsakliga metod anropar metod m1
public void m1{ int x=20 }
I stacken java kommer en ram att skapas från metoden m1.
Variabeln X i m1 kommer också att skapas i ramen för m1 i stacken. (Se bilden nedan).
Metod m1 anropar metod m2. I stack java skapas en ny ram för m2 ovanpå ramen m1.
Variabel b och c kommer också att skapas i en ram m2 i en stack.
public void m2(int b){ boolean c; }
Samma metod m2 anropar metod m3. Återigen skapas en ram m3 på toppen av stapeln (se bilden nedan).
Låt oss nu säga att vår metod m3 skapar ett objekt för klassen "Konto", som har två instansvariabel int p och int q.
Account { Int p; Int q; }
Här är koden för metod m3
public void m3(){ Account ref = new Account(); // more code }
Uttalandet new Account() kommer att skapa ett kontoobjekt i heap.
Referensvariabeln "ref" kommer att skapas i en stack-java.
Tilldelningen "="" kommer att göra en referensvariabel för att peka på objektet i Heapen.
När metoden har slutfört sin exekvering. Kontrollflödet går tillbaka till anropsmetoden. Vilket i det här fallet är metod m2.
Stacken från metod m3 kommer att spolas ut.
Eftersom referensvariabeln inte längre kommer att peka på objektet i högen, skulle den vara kvalificerad för sophämtning.
När metod m2 har slutfört sin exekvering. Den kommer att plockas ut ur stacken, och alla dess variabler kommer att tömmas och inte längre vara tillgängliga för användning.
Likaså för metod m1.
Så småningom kommer kontrollflödet att återgå till programmets startpunkt. Vilket vanligtvis är den "huvudsakliga" metoden.
Vad händer om Object har en referens 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 det här fallet kommer referensvariabeln "barn" att skapas i heap, som i sin tur kommer att peka på sitt objekt, ungefär som i diagrammet nedan.
Vad finns Garbage Collection i Java?
Sophämtning in Java är en process genom vilken programmen utför minneshantering automatiskt. Garbage Collector (GC) hittar de oanvända objekten och raderar dem för att återta minnet. I Java, dynamisk minnesallokering av objekt uppnås med hjälp av den nya operatorn som använder en del minne och minnet förblir allokerat tills det finns referenser för användningen av objektet.
När det inte finns några referenser till ett objekt, antas det inte längre behövs, och minnet som upptas av objektet kan återvinnas. Det finns inget uttryckligt behov av att förstöra ett objekt som Java hanterar avfördelningen automatiskt.
Tekniken som åstadkommer detta är känd som Skräp samling. Program som inte avallokerar minne kan så småningom krascha när det inte finns något minne kvar i systemet att allokera. Dessa program sägs ha minnesläckor. Sophämtning in Java sker automatiskt under programmets livstid, vilket eliminerar behovet av att deallokera minne och därigenom undvika minnesläckor.
I C-språk är det programmerarens ansvar att avallokera minne som tilldelats dynamiskt med hjälp av free()-funktionen. Det är här Java minneshanteringsledningar.
Notera: Alla objekt skapas i minnets heapsektion. Mer om detta i en senare handledning.
Exempel: Att lära sig garbage Collector Mechanism i Java
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 rad # 20,21,22. Spara, kompilera och kör koden.
Steg 4) Som visas i diagrammet nedan pekar två referensvariabler på samma objekt.
Steg 5) Avkommentera rad # 23 & 24. Kompilera, spara och kör koden
Steg 6) Som visas i diagrammet nedan blir s2 null, men s3 pekar fortfarande på objektet och är inte kvalificerad för Java-sopsamling.
Steg 7) Avkommentera rad # 25 & 26. Spara, kompilera och kör koden
Steg 8) Vid denna tidpunkt finns det inga referenser som pekar på objektet och blir kvalificerad för sophämtning. Det kommer att tas bort från minnet och det finns inget sätt att hämta tillbaka det.
Hur man tar bort ett objekt i Java?
1) Om du vill göra ditt objekt kvalificerat för Garbage Collection, tilldela dess referensvariabel till null.
2) Primitiva typer är inte objekt. De kan inte tilldelas null.
Sammanfattning:
- När en metod anropas skapas en ram på toppen av stacken.
- När en metod har slutfört exekvering, återgår flödet av kontroll till anropsmetoden och dess motsvarande stackram töms.
- Lokala variabler skapas i stacken
- Instansvariabler skapas i heapen och är en del av objektet de tillhör.
- Referensvariabler skapas i stacken.