In Java, Speicherverwaltung ist ein lebenswichtiger Prozess. Es wird von Java automatisch verwaltet. Die JVM unterteilt den Speicher in zwei Teile: Stapel Speicher und Heap-Speicher. Aus Sicht von Java handelt es sich bei beiden um wichtige Speicherbereiche, die jedoch für unterschiedliche Zwecke genutzt werden. Der Hauptunterschied zwischen Stapelspeicher und Heapspeicher besteht darin, dass der Stapel zum Speichern der Reihenfolge der Methodenausführung und lokaler Variablen verwendet wird, während der Heapspeicher die Objekte speichert und eine dynamische Speicherzuweisung und -freigabe verwendet. In diesem Abschnitt werden wir die Unterschiede zwischen Stack und Heap im Detail besprechen.
Stapelspeicher
Der Stapelspeicher ist ein physischer Speicherplatz (im RAM), der jedem Thread zur Laufzeit zugewiesen wird. Es wird erstellt, wenn ein Thread erstellt wird. Die Speicherverwaltung im Stapel folgt der LIFO-Reihenfolge (Last-In-First-Out), da global darauf zugegriffen werden kann. Es speichert die Variablen, Referenzen auf Objekte und Teilergebnisse. Der dem Stapel zugewiesene Speicher bleibt bestehen, bis die Funktion zurückkehrt. Wenn kein Platz zum Erstellen der neuen Objekte vorhanden ist, wird das ausgelöstjava.lang.StackOverFlowError. Der Umfang der Elemente ist auf ihre Threads beschränkt. Der JVM Erstellt für jeden Thread einen separaten Stapel.
Heap-Speicher
Es wird beim Start der JVM erstellt und von der Anwendung verwendet, solange die Anwendung ausgeführt wird. Es speichert Objekte und JRE-Klassen. Immer wenn wir Objekte erstellen, belegt es Platz im Heap-Speicher, während die Referenz dieses Objekts im Stapel erstellt wird. Es folgt keiner Reihenfolge wie der Stapel. Es verarbeitet die Speicherblöcke dynamisch. Das bedeutet, dass wir den Speicher nicht manuell verwalten müssen. Um den Speicher automatisch zu verwalten, Java stellt den Garbage Collector bereit, der die Objekte löscht, die nicht mehr verwendet werden. Der dem Heap zugewiesene Speicher bleibt so lange bestehen, bis ein Ereignis (entweder Programm beendet oder freier Speicher) nicht mehr eintritt. Die Elemente sind in der Anwendung global zugänglich. Es handelt sich um einen gemeinsamen Speicherbereich, der von allen Threads gemeinsam genutzt wird. Wenn der Heap-Speicherplatz voll ist, wird das ausgelöstjava.lang.OutOfMemoryError. Der Heap-Speicher ist weiter in folgende Speicherbereiche unterteilt:
- Junge Generation
- Überlebensraum
- Alte Generation
- Permanente Generation
- Code-Cache
Das folgende Bild zeigt die Zuweisung von Stapelspeicher und Heap-Speicherplatz.
Unterschied zwischen Stapel- und Heapspeicher
Die folgende Tabelle fasst alle wichtigen Unterschiede zwischen Stapelspeicher und Heap-Speicher zusammen.
Parameter | Stapelspeicher | Heap-Speicherplatz |
---|---|---|
Anwendung | Es speichert Gegenstände, die eine sehr kurze Lebensdauer haben, wie z Methoden, Variablen, Und Referenzvariablen der Objekte. | Es speichert Objekte und Java Runtime Environment ( JRE ) Klassen. |
Bestellung | Es folgt die LIFO Befehl. | Es folgt keiner Reihenfolge, da es sich um eine dynamische Speicherzuweisung handelt und es kein festes Muster für die Zuweisung und Freigabe von Speicherblöcken gibt. |
Flexibilität | Es ist nicht flexibel weil wir den zugewiesenen Speicher nicht ändern können. | Es ist flexibel weil wir den zugewiesenen Speicher ändern können. |
Effizienz | Es hat Schneller Zugriff, Zuweisung und Freigabe. | Es hat Langsamer Zugriff, Zuweisung und Freigabe. |
Speichergröße | Es ist kleiner in Größe. | Es ist größer in Größe. |
Verwendete Java-Optionen | Wir können die Stapelgröße erhöhen, indem wir die JVM-Option -Xss verwenden. | Mit den JVM-Optionen -Xmx und -Xms können wir die Größe des Heap-Speichers erhöhen oder verringern. |
Sichtbarkeit oder Umfang | Die Variablen sind nur für den Eigentümerthread sichtbar. | Es ist für alle Threads sichtbar. |
Raumerzeugung | Wenn ein Thread erstellt wird, weist das Betriebssystem den Stapel automatisch zu. | Um den Heap-Speicherplatz für die Anwendung zu erstellen, ruft die Sprache zur Laufzeit zunächst das Betriebssystem auf. |
Verteilung | Für jedes Objekt wird ein separater Stapel erstellt. | Es wird von allen Threads gemeinsam genutzt. |
Ausnahmewürfe | JVM wirft das java.lang.StackOverFlowError wenn die Stapelgröße größer als das Limit ist. Um diesen Fehler zu vermeiden, erhöhen Sie die Stapelgröße. | JVM wirft das java.lang.OutOfMemoryError wenn die JVM keine neue native Methode erstellen kann. |
Zuteilung/Aufhebung der Zuteilung | Dies erfolgt automatisch durch die Compiler . | Dies erfolgt manuell durch die Programmierer . |
Kosten | Seine Kosten betragen weniger . | Seine Kosten betragen mehr im Vergleich zum Stapel. |
Implementierung | Seine Umsetzung ist hart . | Seine Umsetzung ist einfach . |
Reihenfolge der Zuteilung | Speicherzuordnung ist kontinuierlich . | Speicher zugewiesen in zufällig Befehl. |
Thread-Sicherheit | Es ist Thread-sicher, da jeder Thread seinen eigenen Stapel hat. | Es ist nicht threadsicher, daher ist eine ordnungsgemäße Synchronisierung des Codes erforderlich. |