Speicherverwaltung in Java

Was ist Stapelspeicher?

Stack in Java ist ein Speicherabschnitt, der Methoden, lokale Variablen und Referenzvariablen enthält. Auf den Stapelspeicher wird immer in der Reihenfolge „Last-In-First-Out“ verwiesen. Lokale Variablen werden im Stack erstellt.

Was ist Heap-Speicher?

Heap ist ein Speicherbereich, der Objekte und möglicherweise auch Referenzvariablen enthält. Instanzvariablen werden im Heap erstellt.

Speicherzuordnung in Java

Speicherzuordnung 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. Bei der Deklaration wird einem Objekt jedoch kein Speicher zugewiesen, sondern es wird lediglich eine Referenz erstellt. Für die Speicherzuweisung des Objekts wird die Methode new() verwendet, sodass dem Objekt immer Speicher auf dem Heap zugewiesen wird.

Der Java Die Speicherzuweisung ist in folgende Abschnitte unterteilt:

  1. Heap
  2. Stapeln
  3. Code
  4. Statisch

Diese Aufteilung des Speichers ist für seine effektive Verwaltung erforderlich.

  • Der Code Abschnitt enthält Ihre Bytecode.
  • Der Stapeln Abschnitt des Speichers enthält Methoden, lokale Variablen und Referenzvariablen.
  • Der Heap Abschnitt enthält Objekte (kann auch Referenzvariablen enthalten).
  • Der Statisch Abschnitt enthält Statische Daten/Methoden.

Unterschied zwischen lokaler und Instanzvariable

Instanzvariable wird deklariert innerhalb einer Klasse, aber nicht innerhalb einer Methode

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

Lokale Variable sind deklariert innerhalb a Methode einschließlich Methode Argumente.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

Unterschied zwischen Stack und Heap

Klicke hier wenn das Video nicht zugänglich ist

Um dies besser zu verstehen, nehmen wir ein Beispiel. Stellen Sie sich vor, Ihre Hauptmethode, die die Methode m1 aufruft,

public void m1{
int x=20
}

Im Stack Java wird aus der Methode m1 ein Frame erstellt.

Java Stapel und Haufen

Die Variable X in m1 wird auch im Rahmen für m1 im Stapel erstellt. (Siehe Bild unten).

Java Stapel und Haufen

Methode m1 ruft Methode m2 auf. Im Stack Java wird ein neuer Frame für m2 über dem Frame m1 erstellt.

Java Stapel und Haufen

Java Stapel und Haufen

Die Variablen b und c werden ebenfalls in einem Frame m2 in einem Stapel erstellt.

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

Java Stapel und Haufen

Dieselbe Methode m2 ruft Methode m3 auf. Wieder wird ein Frame m3 oben auf dem Stapel erstellt (siehe Abbildung unten).

Java Stapel und Haufen

Java Stapel und Haufen

Nehmen wir nun an, unsere Methode m3 erstellt ein Objekt für die Klasse „Account“, die zwei hat Instanzenvariable int p und int q.

Account {
             Int p;
             Int q;
       }

Hier ist der Code für Methode m3

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

Die Anweisung new Account() erstellt ein Kontoobjekt im Heap.

Java Stapel und Haufen

Die Referenzvariable „ref“ wird in einem Stack-Java erstellt.

Java Stapel und Haufen

Der Zuweisungsoperator „=“ erstellt eine Referenzvariable, die auf das Objekt im Heap zeigt.

Java Stapel und Haufen

Sobald die Methode ihre Ausführung abgeschlossen hat, wird der Kontrollfluss an die aufrufende Methode zurückgegeben. In diesem Fall ist dies die Methode m2.

Java Stapel und Haufen

Der Stapel von Methode m3 wird geleert.

Java Stapel und Haufen

Da die Referenzvariable nicht mehr auf das Objekt im Heap zeigt, wäre sie für die Garbage Collection geeignet.

Java Stapel und Haufen

Sobald die Ausführung der Methode m2 abgeschlossen ist, wird sie aus dem Stapel entfernt und alle ihre Variablen werden gelöscht und stehen nicht mehr zur Verwendung zur Verfügung.

Gleiches gilt für Methode m1.

Schließlich kehrt der Kontrollfluss zum Startpunkt des Programms zurück. Dies ist normalerweise die „Hauptmethode“.

Was passiert, 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, die wiederum auf ihr Objekt zeigt, etwa wie im unten gezeigten Diagramm.

Java Stapel und Haufen

Was ist Garbage Collection in Java?

Garbage Collection in Java ist ein Prozess, mit dem Programme die Speicherverwaltung automatisch durchführen. Der Garbage Collector (GC) findet die nicht verwendeten Objekte und löscht sie, um den Speicher freizugeben. In JavaDie dynamische Speicherzuweisung von Objekten wird mithilfe des neuen Operators erreicht, der einen Teil des Speichers verwendet und der Speicher zugewiesen bleibt, bis Referenzen für die Verwendung des Objekts vorhanden sind.

Wenn es keine Referenzen auf ein Objekt gibt, wird davon ausgegangen, dass es nicht mehr benötigt wird, und der vom Objekt belegte Speicher kann freigegeben werden. Es besteht keine explizite Notwendigkeit, ein Objekt zu zerstören, da Java behandelt die Aufhebung der Zuordnung automatisch.

Die Technik, die dies erreicht, ist bekannt als Müllsammlung. Programme, die die Speicherzuweisung nicht aufheben, können schließlich abstürzen, wenn im System kein Speicher mehr zum Zuweisen vorhanden ist. Diese Programme sollen es haben Speicherlecks. Müllabfuhr in Java geschieht automatisch während der Lebensdauer des Programms, wodurch die Notwendigkeit entfällt, Speicher freizugeben und dadurch Speicherlecks zu vermeiden.

In der Programmiersprache C ist es die Aufgabe des Programmierers, den dynamisch zugewiesenen Speicher mit der Funktion free() freizugeben. Hier Java Speicherverwaltung führt.

Hinweis: Alle Objekte werden im Heap-Bereich des Speichers erstellt. Mehr dazu in einem späteren Tutorial.

Beispiel: So lernen Sie den Garbage Collector-Mechanismus in Java

Schritt 1) Kopieren Sie den folgenden Code in einen 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();
  }
}

Schritt 2) Speichern, kompilieren und führen Sie den Code aus. Wie im Diagramm dargestellt, werden zwei Objekte und zwei Referenzvariablen erstellt.


Garbage-Collector-Mechanismus

Schritt 3) Kommentieren Sie Zeile Nr. 20,21,22 aus. Speichern, kompilieren und führen Sie den Code aus.

Schritt 4) Wie im Diagramm unten gezeigt, zeigen zwei Referenzvariablen auf dasselbe Objekt.

Garbage-Collector-Mechanismus

Schritt 5) Kommentieren Sie die Zeilen Nr. 23 und 24 aus. Kompilieren, speichern und führen Sie den Code aus

Schritt 6) Wie im Diagramm unten gezeigt, wird s2 null, aber s3 zeigt immer noch auf das Objekt und ist nicht für die Java-Garbage-Collection geeignet.

Garbage-Collector-Mechanismus

Schritt 7) Kommentieren Sie die Zeilen Nr. 25 und 26 aus. Speichern, kompilieren und führen Sie den Code aus

Schritt 8) Zu diesem Zeitpunkt gibt es keine Referenzen, die auf das Objekt verweisen, und es ist für die Garbage Collection geeignet. Es wird aus dem Speicher entfernt und es gibt keine Möglichkeit, es wiederherzustellen.

Lernen Sie Garbage Collector

So löschen Sie ein Objekt in Java?

1) Wenn Sie Ihr Objekt für die Garbage Collection geeignet machen möchten, weisen Sie seiner Referenzvariablen den Wert null zu.

2) Primitive Typen sind keine Objekte. Ihnen kann nicht null zugewiesen werden.

So löschen Sie ein Objekt in Java

Zusammenfassung:

  • Wenn eine Methode aufgerufen wird, wird oben auf dem Stapel ein Rahmen erstellt.
  • Sobald die Ausführung einer Methode abgeschlossen ist, kehrt der Kontrollfluss zur aufrufenden Methode zurück und der entsprechende Stapelrahmen wird geleert.
  • Lokale Variablen werden im Stack erstellt
  • Instanzvariablen werden im Heap erstellt und sind Teil des Objekts, zu dem sie gehören.
  • Referenzvariablen werden im Stack angelegt.