Java Stack and Heap: zelfstudie over Java-geheugentoewijzing

Inhoudsopgave:

Anonim

Wat is stapelgeheugen?

Stack in Java is een gedeelte van het geheugen dat methoden, lokale variabelen en referentievariabelen bevat. Er wordt altijd naar stapelgeheugen verwezen in de volgorde Last-In-First-Out. Lokale variabelen worden gemaakt in de stapel.

Wat is Heap-geheugen?

Heap is een gedeelte van het geheugen dat objecten bevat en mogelijk ook referentievariabelen. Instantievariabelen worden in de heap gemaakt

Geheugentoewijzing in Java

Geheugentoewijzing in Java is het proces waarbij de virtuele geheugensecties opzij worden gezet in een programma voor het opslaan van de variabelen en instanties van structuren en klassen. Het geheugen wordt echter niet toegewezen aan een object bij aangifte, maar er wordt alleen een referentie gemaakt. Voor de geheugentoewijzing van het object wordt de methode new () gebruikt, dus het object krijgt altijd geheugen op de heap toegewezen.

De Java-geheugentoewijzing is onderverdeeld in de volgende secties:

  1. Hoop
  2. Stapel
  3. Code
  4. Statisch

Deze geheugenverdeling is vereist voor een effectief beheer ervan.

  • Het codegedeelte bevat uw bytecode .
  • De Stack- sectie van het geheugen bevat methoden, lokale variabelen en referentievariabelen.
  • De Heap- sectie bevat objecten (kan ook referentievariabelen bevatten).
  • De sectie Statisch bevat statische gegevens / methoden .

Verschil tussen lokale en instantievariabele

Instancevariabele wordt binnen een klasse gedeclareerd, maar niet binnen een methode

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

Lokale variabelen worden binnen een methode gedeclareerd , inclusief methode- argumenten .

public void sum(int a){int x = int a + 3;// a , x are local variables;}

Verschil tussen Stack en Heap


Klik hier als de video niet toegankelijk is

Laten we een voorbeeld nemen om dit beter te begrijpen.

Bedenk dat uw belangrijkste methode die methode m1 aanroept

public void m1{int x=20}

In de stack java wordt een frame gemaakt op basis van methode m1.

De variabele X in m1 wordt ook aangemaakt in het frame voor m1 in de stapel. (Zie onderstaande afbeelding).

Methode m1 roept methode m2 aan. In de stapel java wordt een nieuw frame gemaakt voor m2 bovenop het frame m1.

Variabele b en c worden ook gemaakt in een frame m2 in een stapel.

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

Dezelfde methode m2 roept methode m3 aan. Opnieuw ontstaat er een frame m3 bovenop de stapel (zie onderstaande afbeelding).

Laten we nu zeggen dat onze methode m3 een object maakt voor de klasse "Account", die twee instances heeft: variabele int p en int q.

Account {Int p;Int q;}

Hier is de code voor methode m3

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

De instructie new Account () zal een account in heap creëren.

De referentievariabele "ref" wordt aangemaakt in een stack java.

De toewijzing operator zal een referentievariabele maken om naar het object in de heap te verwijzen.

Zodra de methode zijn uitvoering heeft voltooid. De stroom van controle gaat terug naar de aanroepende methode. Wat in dit geval methode m2 is.

De stapel van methode m3 wordt weggespoeld.

Aangezien de referentievariabele niet langer naar het object in de heap verwijst, komt het in aanmerking voor garbage collection.

Zodra methode m2 de uitvoering heeft voltooid. Het zal uit de stapel worden geklapt en al zijn variabelen worden weggespoeld en zijn niet langer beschikbaar voor gebruik.

Evenzo voor methode m1.

Uiteindelijk keert de controlestroom terug naar het startpunt van het programma. Wat meestal de "belangrijkste" methode is.

Wat moet ik doen als Object een verwijzing als instantievariabele heeft?

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 }

In dit geval wordt de referentievariabele "child" in heap gemaakt, die op zijn beurt naar zijn object verwijst, zoiets als het onderstaande diagram.

Overzicht:

  • Wanneer een methode wordt aangeroepen, wordt er een frame bovenop de stapel gemaakt.
  • Zodra een methode de uitvoering heeft voltooid, keert de controlestroom terug naar de aanroepende methode en wordt het bijbehorende stapelframe doorgespoeld.
  • Lokale variabelen worden gemaakt in de stapel
  • Instantievariabelen worden in de heap gemaakt en maken deel uit van het object waartoe ze behoren.
  • Referentievariabelen worden gemaakt in de stapel.