Heim  >  Artikel  >  Java  >  Heap vs. Stack: Wie Java verwaltet, was man sich merken oder vergessen sollte

Heap vs. Stack: Wie Java verwaltet, was man sich merken oder vergessen sollte

PHPz
PHPzOriginal
2024-09-08 16:32:02318Durchsuche

Wenn wir ein Programm ausführen, weist das Betriebssystem Speicher zu, damit diese Anwendung Daten speichern und so lange wie nötig abrufen kann. Im Gegensatz zu C oder C++, bei denen der Programmierer die Freiheit hat, Speicher zuzuweisen und Zeiger „von Hand“ zu verwalten, verwaltet die JVM (Java Virtual Machine) in Java den flüchtigen Speicher und abstrahiert diese Komplexität für uns in zwei Zuordnungssystemen, dem Heap und dem Stapel.

Der Unterschied zwischen ihnen liegt im Zweck der Speicherung und der Notwendigkeit (oder nicht), diese Daten mit mehreren Prozessen zu teilen.

Die JVM verwendet den Stack für kurzfristige Daten und folgt einer LIFO-Struktur (Last In First Out). Der Stack ist ein Speicherbereich, der dazu dient, die Ausführung von Methoden zu verwalten, lokale Variablen und Methodenaufrufe organisiert in Frames zu speichern. Jeder Thread in der JVM hat seinen eigenen Stapel.

Der Heap ist ein globaler Speicherbereich, der von allen Threads gemeinsam genutzt wird und in dem Objekte und Variablen zugewiesen werden, die eine Nutzungsdauer haben müssen, die über den Rahmen der Methode hinausgeht, die sie erstellt hat.

Der Speicher auf dem Heap wird vom Garbage Collector verwaltet, der nicht referenzierte Objekte entfernt, um Speicherplatz freizugeben, der für Langzeitdaten verwendet wird.

Lassen Sie uns ein praktisches Beispiel verwenden.

Wenn eine primitive Variable im Bereich einer Methode erstellt wird, muss sie während der Ausführung der Methode zur Verwendung verfügbar sein. Auf diese Weise speichert Stack diese Variable, da sie für den Lebenszyklus von Daten verantwortlich ist, die im Programm eine einzigartige und spezifische Verwendung haben.

Wenn eine Methode jedoch eine Instanz erstellt, kann dieses Objekt in anderen Teilen des Programms verwendet werden und nicht nur dort, wo es deklariert wurde. Dies geschieht eindeutig, wenn wir ein Objekt erstellen, das einen Datensatz in der Datenbank darstellt. In unserem Programm kann dieselbe Instanz während einer Ausführung konsultiert, bearbeitet und entfernt werden. Auf diese Weise kümmert sich Heap um die Speicherung des Objekts.

Um diesen Punkt zu veranschaulichen, werde ich ein einfaches Beispiel verwenden, das Autor Hanumant Deshmukh in seinem Leitfaden „OCP Java SE 17/21 Programmer Exam Fundamentals“ beschreibt. Dieses Buch ist übrigens wunderbar, da es durchaus komplexe Prozesse sehr didaktisch erklärt. Ich kann es nur wärmstens empfehlen, wenn Sie wie ich auf der Suche nach der Oracle Certified Professional (OCP)-Zertifizierung sind. Der Autor verwendet zu Lehrzwecken eine String-Instanz, aber ich werde hier ein benutzerdefiniertes Objekt verwenden, nur um das Risiko einer Urheberrechtsverletzung zu vermeiden (:S)

public class Main {
    public static void main(String[] args) {
        HeapObj heapObject = newObject();
        int counter = 0;

        while (counter++ < 10){
            print(heapObject.getName());
        }
    }

    public static HeapObj newObject(){
        return new HeapObj("Happy instance");
    }

    public static void print(String text){
        System.out.println(text);
    }
}

Im Beispiel ruft die Main-Klasse drei Methoden auf: die Hauptmethode, eine, die die Instanz des HeapObj-Objekts erstellt, und eine andere, die nur Text druckt.

Wenn wir ein Foto machen würden, nachdem alle Methoden bereits aufgerufen wurden, würden Stack und Heap so aussehen:

Heap vs Stack: como o Java gerencia o que deve ser lembrado ou esquecido

Mit anderen Worten:

1. Beim Start:

Stack: Hauptrahmen (enthält Argumente, HeapObject, Zähler).
Haufen: Leer.

2. Nach newObject:

Stack: Hauptrahmen (enthält Argumente, HeapObject-Referenz, Zähler).
Heap: Ein HeapObj-Objekt mit der Zeichenfolge „Happy example“.

3. Während der Schleife:

Stapel: Hauptrahmen (enthält Argumente, HeapObject-Referenz, Zähler), mehrere Druckrahmen, die gestapelt und entstapelt werden.
Heap: Das gleiche HeapObj-Objekt und die Zeichenfolge „Happy example“.

4. Nach der Schleife:

Stack: Hauptrahmen (enthält Argumente, HeapObject-Referenz).
Heap: Das gleiche HeapObj-Objekt und die Zeichenfolge „Happy example“.

5. Am Ende des Programms:

Stapel: leer.
Heap: leer.

Das obige ist der detaillierte Inhalt vonHeap vs. Stack: Wie Java verwaltet, was man sich merken oder vergessen sollte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn