Wenn eine Person anfängt, Java oder andere Programmiersprachen zu lernen, wird sie mit dem Heap und dem Stapel in Kontakt kommen. Da es zu Beginn keine klare und klare Erklärung gibt, werden viele Menschen viele Fragen haben. Was ist der Stapel und was ist der Unterschied zwischen Heap und Stack? Was noch schlimmer ist, ist, dass es in Java einen Stapel gibt, eine sequentielle Last-In-First-Out-Datenstruktur (Last In First Out), nämlich java.util.Stack. In diesem Fall wird die vorherige Frage zwangsläufig viele Menschen noch mehr verwirren. Tatsächlich sind Heap und Stack beide Teile des Speichers und haben unterschiedliche Funktionen. Ein Programm muss in diesem Bereich Speicher zuweisen. Wie wir alle wissen, werden alle Java-Programme in der virtuellen JVM-Maschine ausgeführt. Was wir hier vorstellen, ist natürlich der Heap und Stack im (virtuellen) JVM-Speicher.
der Unterschied
Der Unterschied zwischen Heap und Stack in Java ist natürlich eine häufige Frage in Interviews. Die folgenden Punkte sind die spezifischen Unterschiede.
Jeder erfüllt seine Pflichten
Der Hauptunterschied besteht darin, dass der Stapelspeicher zum Speichern lokaler Variablen und Methodenaufrufe verwendet wird.
Der Heap-Speicher wird zum Speichern von Objekten in Java verwendet. Unabhängig davon, ob es sich um Mitgliedsvariablen, lokale Variablen oder Klassenvariablen handelt, werden die Objekte, auf die sie verweisen, im Heapspeicher gespeichert.
Exklusiv oder geteilt
Der Stapelspeicher gehört zu einem einzelnen Thread, und die darin gespeicherten Variablen können nur in dem Thread sichtbar sein, zu dem er gehört. Das heißt, der Stapelspeicher kann als privater Speicher des Threads verstanden werden.
Objekte im Heap-Speicher sind für alle Threads sichtbar. Auf Objekte im Heap-Speicher kann von allen Threads zugegriffen werden.
Ausnahmefehler
Wenn im Stapelspeicher kein Platz zum Speichern von Methodenaufrufen und lokalen Variablen verfügbar ist, löst die JVM einen java.lang.StackOverFlowError aus.
Und wenn im Heap-Speicher kein Platz zum Speichern des generierten Objekts vorhanden ist, löst die JVM einen java.lang.OutOfMemoryError aus.
Raumgröße
Der Stapelspeicher ist viel kleiner als der Heapspeicher. Wenn Sie Rekursion verwenden, wird Ihr Stapel schnell voll. Wenn die Rekursion nicht rechtzeitig ausbricht, tritt wahrscheinlich ein StackOverFlowError-Problem auf.
Sie können die Größe des Stapelspeichers mit der Option -Xss festlegen. Die Option -Xms legt die Startgröße des Heaps fest, und die Option -Xmx legt die maximale Heap-Größe fest.
Dies ist der Unterschied zwischen Heap und Stack in Java. Wenn Sie dieses Problem gut verstehen, kann es Ihnen helfen, Entwicklungsprobleme zu lösen, die Heap- und Stack-Speichernutzung zu analysieren und sogar eine Leistungsoptimierung durchzuführen.
Standardwert anzeigen (aktualisiert)
Um den Standardwert des Heaps anzuzeigen, verwenden Sie den folgenden Code, wobei InitialHeapSize die Größe des anfänglichen Heaps und MaxHeapSize der Maximalwert des Heaps ist.
Kopieren Sie den Codecode wie folgt:
13:17 $ java -XX:+PrintFlagsFinal -version |
uintx ErgoHeapSizeLimit = 0 {Produkt}
uintx HeapSizePerGCThread = 87241520 {Produkt}
uintx InitialHeapSize := 134217728 {Produkt}
uintx LargePageHeapSizeThreshold = 134217728 {Produkt}
uintx MaxHeapSize := 2147483648 {Produkt}
Java-Version „1.8.0_25“
Java(TM) SE-Laufzeitumgebung (Build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit-Server-VM (Build 25.25-b02, gemischter Modus)
Überprüfen Sie den Standardwert des Stapels, wobei ThreadStackSize die Größe des Stapelspeichers ist.
Kopieren Sie den Codecode wie folgt:
13:21 $ java -XX:+PrintFlagsFinal -version |
intx CompilerThreadStackSize = 0 {pd-Produkt}
intx ThreadStackSize = 1024 {pd-Produkt}
intx VMThreadStackSize = 1024 {pd-Produkt}
Java-Version „1.8.0_25“
Java(TM) SE-Laufzeitumgebung (Build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit-Server-VM (Build 25.25-b02, gemischter Modus)
Übersetzungsinformationen
Englischer Originaltext: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.
Die Übersetzung wurde basierend auf dem Originaltext geändert, geordnet und gelöscht. Bei Interesse können Sie den Originaltext einsehen. PS-Adresse wurde gesperrt.