Heim >Java >javaLernprogramm >Heap vs. Stack: Wie Java verwaltet, was man sich merken oder vergessen sollte
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:
Mit anderen Worten:
Stack: Hauptrahmen (enthält Argumente, HeapObject, Zähler).
Haufen: Leer.
Stack: Hauptrahmen (enthält Argumente, HeapObject-Referenz, Zähler).
Heap: Ein HeapObj-Objekt mit der Zeichenfolge „Happy example“.
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“.
Stack: Hauptrahmen (enthält Argumente, HeapObject-Referenz).
Heap: Das gleiche HeapObj-Objekt und die Zeichenfolge „Happy example“.
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!