Vad är Stack Memory?
Stack i java är en del av minnet som innehåller metoder, lokala variabler och referensvariabler. Stackminne refereras alltid till i Last-In-First-Out-ordning. Lokala variabler skapas i stacken.
Vad är Heap Memory?
Heap är en del av minnet som innehåller objekt och kan också innehålla referensvariabler. Instansvariabler skapas i högen
Minnesallokering i Java
Minnesallokering i Java är den process där de virtuella minnesavsnitten är avsatta i ett program för att lagra variabler och instanser av strukturer och klasser. Minnet allokeras dock inte till ett objekt vid deklarationen utan bara en referens skapas. För minnets allokering av objektet används ny () -metod, så objektet tilldelas alltid minne på högen.
Java Memory Allocation är uppdelad i följande avsnitt:
- Högen
- Stack
- Koda
- Statisk
Denna uppdelning av minne krävs för effektiv hantering.
- I koden avsnittet innehåller din bytekod .
- Den Stack sektion av minnet innehåller metoder, lokala variabler och referensvariabler.
- Den Heap avsnittet innehåller objekt (kan också innehålla referensvariabler).
- Det statiska avsnittet innehåller statiska data / metoder .
Skillnad mellan lokal och instansvariabel
Instansvariabel deklareras i en klass men inte i en metod
class Student{int num; // num is instance variablepublic void showData{}
Lokal variabel deklareras inuti en metod inklusive metod argument .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Skillnad 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 huvudmetod anropsmetod m1
public void m1{int x=20}
I stack-Java skapas en ram från metod m1.
Variabeln X i m1 skapas också i ramen för m1 i stacken. (Se bilden nedan).
Metod m1 kallar metod m2. I stack-java skapas en ny ram för m2 ovanpå ramen m1.
Variabel b och c skapas också i en ram m2 i en stack.
public void m2(int b){boolean c;}
Samma metod m2 kallar metod m3. Återigen skapas en ram m3 på toppen av stacken (se bilden nedan).
Låt oss säga att vår metod m3 skapar ett objekt för klass "Konto", som har två instanser variabla 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 nytt konto () skapar ett kontoobjekt i hög.
Referensvariabeln "ref" skapas i en stack-Java.
Tilldelningsoperatören gör en referensvariabel för att peka på objektet i högen.
När metoden har slutfört sin körning. Flödet av kontroll kommer att gå tillbaka till anropsmetoden. Vilket i detta fall är metod m2.
Stapeln från metod m3 spolas ut.
Eftersom referensvariabeln inte längre pekar på objektet i högen skulle den vara berättigad till sopuppsamling.
När metoden m2 har slutfört körningen. Den kommer att poppas ut ur stacken, och all dess variabel kommer att spolas och inte längre vara tillgänglig 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 objektet har en referens 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 det här fallet kommer referensvariabeln "barn" att skapas i hög, vilket i sin tur pekar på sitt objekt, ungefär som diagrammet som visas nedan.
Sammanfattning:
- När en metod anropas skapas en ram på toppen av stacken.
- När en metod har slutfört körningen återgår kontrollflödet till anropsmetoden och dess motsvarande stackram spolas.
- Lokala variabler skapas i stacken
- Instansvariabler skapas i högen och är en del av objektet de tillhör.
- Referensvariabler skapas i stacken.