Was ist Stapelspeicher?
Der Stapel in Java ist ein Speicherabschnitt, der Methoden, lokale Variablen und Referenzvariablen enthält. Der Stapelspeicher wird immer in der Reihenfolge Last-In-First-Out referenziert. Lokale Variablen werden im Stapel erstellt.
Was ist Heapspeicher?
Heap ist ein Speicherabschnitt, der Objekte enthält und möglicherweise auch Referenzvariablen enthält. Instanzvariablen werden im Heap erstellt
Speicherzuordnung in Java
Die Speicherzuweisung in Java ist der Prozess, bei dem die virtuellen Speicherabschnitte in einem Programm zum Speichern der Variablen und Instanzen von Strukturen und Klassen reserviert werden. Der Speicher wird jedoch bei der Deklaration keinem Objekt zugewiesen, sondern nur eine Referenz erstellt. Für die Speicherzuordnung des Objekts wird die Methode new () verwendet, sodass dem Objekt immer Speicher auf dem Heap zugewiesen wird.
Die Java-Speicherzuordnung ist in folgende Abschnitte unterteilt:
- Haufen
- Stapel
- Code
- Statisch
Diese Speicheraufteilung ist für die effektive Verwaltung erforderlich.
- Der Codeabschnitt enthält Ihren Bytecode .
- Der Stapelabschnitt des Speichers enthält Methoden, lokale Variablen und Referenzvariablen.
- Der Heap- Abschnitt enthält Objekte (kann auch Referenzvariablen enthalten).
- Der statische Abschnitt enthält statische Daten / Methoden .
Unterschied zwischen lokaler und Instanzvariable
Die Instanzvariable wird innerhalb einer Klasse deklariert, jedoch nicht innerhalb einer Methode
class Student{int num; // num is instance variablepublic void showData{}
Die lokale Variable deklariert innerhalb eines Verfahrens einschließlich Verfahren Argumente .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Unterschied zwischen Stapel und Haufen
Klicken Sie hier, wenn das Video nicht zugänglich ist
Nehmen wir ein Beispiel, um dies besser zu verstehen.
Bedenken Sie, dass Ihre Hauptmethode die Methode m1 aufruft
public void m1{int x=20}
Im Stack Java wird aus der Methode m1 ein Frame erstellt.
Die Variable X in m1 wird auch im Rahmen für m1 im Stapel erstellt. (Siehe Bild unten).
Die Methode m1 ruft die Methode m2 auf. Im Stack Java wird ein neuer Frame für m2 über dem Frame m1 erstellt.
Die Variablen b und c werden auch in einem Rahmen m2 in einem Stapel erstellt.
public void m2(int b){boolean c;}
Dieselbe Methode m2 ruft die Methode m3 auf. Wieder wird ein Rahmen m3 oben auf dem Stapel erstellt (siehe Bild unten).
Angenommen, unsere Methode m3 erstellt ein Objekt für die Klasse "Account", das zwei Instanzen mit den Variablen int p und int q enthält.
Account {Int p;Int q;}
Hier ist der Code für die Methode m3
public void m3(){Account ref = new Account();// more code}
Der Kontoauszug new Account () erstellt ein Kontoobjekt im Heap.
Die Referenzvariable "ref" wird in einem Stack-Java erstellt.
Der Operator für die Zuweisung erstellt eine Referenzvariable, die auf das Objekt im Heap verweist.
Sobald die Methode ihre Ausführung abgeschlossen hat. Der Kontrollfluss kehrt zur aufrufenden Methode zurück. Was in diesem Fall die Methode m2 ist.
Der Stapel aus Methode m3 wird ausgespült.
Da die Referenzvariable nicht mehr auf das Objekt im Heap verweist, ist sie für die Speicherbereinigung geeignet.
Sobald die Methode m2 ihre Ausführung abgeschlossen hat. Es wird aus dem Stapel genommen, und alle seine Variablen werden geleert und stehen nicht mehr zur Verwendung zur Verfügung.
Ebenso für Methode m1.
Schließlich kehrt der Kontrollfluss zum Startpunkt des Programms zurück. Was normalerweise die "Haupt" -Methode ist.
Was ist, wenn Object eine Referenz als Instanzvariable hat?
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 diesem Fall wird die Referenzvariable "child" im Heap erstellt, der wiederum auf sein Objekt zeigt, ähnlich wie das unten gezeigte Diagramm.
Zusammenfassung:
- Wenn eine Methode aufgerufen wird, wird oben im Stapel ein Frame erstellt.
- Sobald eine Methode die Ausführung abgeschlossen hat, kehrt der Steuerungsfluss zur aufrufenden Methode zurück und der entsprechende Stapelrahmen wird geleert.
- Lokale Variablen werden im Stapel erstellt
- Instanzvariablen werden im Heap erstellt und sind Teil des Objekts, zu dem sie gehören.
- Referenzvariablen werden im Stapel erstellt.