Heim > Java > JavaBase > Hauptteil

Der Unterschied zwischen Heap- und Stack-Java

angryTom
Freigeben: 2019-11-13 14:32:20
Original
4383 Leute haben es durchsucht

Der Unterschied zwischen Heap- und Stack-Java

Der Unterschied zwischen Heap und Stack Java

Bevor wir über Heap und Stack sprechen, sprechen wir über JVM (virtuell). Speicheraufteilung der Maschine:

Java-Programme müssen Speicherplatz zuweisen, wenn sie ausgeführt werden. Die Java Virtual Machine muss auch Speicherplatz zuweisen, wenn sie ausgeführt wird. Die JVM öffnet einen Speicherbereich im Speicher, wenn sie ausgeführt wird, und teilt ihn beim Start sorgfältiger in ihren eigenen Speicherbereich auf. Da jeder Speicherbereich in der virtuellen Maschine auf unterschiedliche Weise verarbeitet wird, muss er separat verwaltet werden .

Der JVM-Speicher ist in fünf Teile unterteilt:

1. Lokaler Methodenbereich; >3. Methodenbereich;

4.

Konzentrieren wir uns auf den Heap und den Stack:

Stapelspeicher: Der Stapelspeicher ist zunächst ein Speicherbereich, der lokale Variablen speichert, die alle in Methoden definiert sind. Alle sind lokale Variablen (Globale Variablen außerhalb der Methode). Lokale Variablen müssen auch innerhalb der for-Schleife definiert werden, bevor lokale Variablen definiert werden können. Daher stapelt die Methode zuerst die Variablen Gültigkeitsbereich wird die Variable freigegeben, sobald sie den Gültigkeitsbereich verlässt. Der Stapelspeicher wird sehr schnell aktualisiert, da lokale Variablen einen kurzen Lebenszyklus haben.

Heap-Speicher: Speichert Arrays und Objekte (eigentlich sind Arrays alles, was im Heap erstellt wurde). Entitäten werden zum Kapseln von Daten verwendet (Mehrere Attribute einer Entität). Wenn ein Datenelement verschwindet, ist die Entität nicht verschwunden und kann weiterhin verwendet werden. Der Stapel speichert jedoch nur ein einziges Variable. Sobald die Variable freigegeben wird, ist sie verschwunden. Obwohl die Entitäten im Heap nicht freigegeben werden, werden sie als Müll behandelt. Java verfügt über einen Garbage-Collection-Mechanismus, um sie von Zeit zu Zeit zu sammeln.

Lassen Sie uns anhand einer Illustration ausführlich über Heap und Stack sprechen:

Zum Beispiel die Anweisung in der Hauptfunktion int [] arr=new int [3] ; im Speicher Wie es definiert ist:

Die Hauptfunktion geht zuerst zum Stapel, definiert eine Variable arr im Stapel und weist dann arr einen Wert zu, aber die rechte Seite ist kein bestimmter Wert, sondern eine Entität. Die Entität wird im Heap durch das neue Schlüsselwort erstellt. Wenn der Speicher Daten speichert, wird die Adresse als kontinuierliche Binäradresse angezeigt die Entität. Arrays haben einen Index, nachdem die Array-Entität im Heap-Speicher generiert wurde. Jeder Speicherplatz wird standardmäßig initialisiert (dies ist ein Merkmal des Heap-Speichers). Nicht initialisierte Daten können nicht verwendet werden, sie können jedoch im Heap verwendet werden. Weil dies der Fall ist initialisiert, aber nicht auf dem Stapel), verschiedene Typen haben unterschiedliche Initialisierungswerte. So werden Variablen und Entitäten im Heap und Stack erstellt:

Wie sind also Heap und Stack verbunden?

Wir haben gerade sagte, dass wir dem Heap eine Adresse zuweisen, die Adresse des Heaps arr zuweisen und arr über die Adresse auf das Array verweisen. Wenn arr also das Array manipulieren möchte, verwendet es die Adresse, anstatt ihm Entitäten direkt zuzuweisen. Wir nennen dies nicht mehr einen Basisdatentyp, sondern einen Referenzdatentyp. Es heißt arr und bezieht sich auf die Entität im Heap-Speicher. (Kann als Zeiger auf C oder C++ verstanden werden, Java ist aus C++ hervorgegangen und C++ ist sehr ähnlich, optimiertes C++) Der Unterschied zwischen Heap- und Stack-Java

If when int [] arr=null;

arr zeigt auf nichts und die Funktion von null besteht darin, den Zeiger des Datentyps zu dereferenzieren.

Wenn ein Referenzdatentyp nicht auf eine Entität verweist, wird sie nicht im Heapspeicher freigegeben, sondern als Müll behandelt und zu unregelmäßigen Zeiten automatisch recycelt, da Java über einen automatischen Recyclingmechanismus verfügt. (C++ tut dies nicht und erfordert vom Programmierer eine manuelle Wiederverwendung. Wenn es nicht wiederverwendet wird, wächst der Heap, bis er voll ist und der Speicher überläuft, sodass Java bei der Speicherverwaltung besser als C++ ist.) Der automatische Recyclingmechanismus (Programm) überwacht automatisch, ob sich Müll im Heap befindet. Wenn ja, führt er automatisch eine Müllsammlung durch, es ist jedoch nicht sicher, wann er gesammelt wird. Der Unterschied zwischen Heap- und Stack-Java

Der Unterschied zwischen Heap und Stack ist offensichtlich:

1. Der Stapelspeicher speichert lokale Variablen, während der Heapspeicher Entitäten speichert Der Speicher wird schneller aktualisiert als der Heap-Speicher, da der Lebenszyklus lokaler Variablen sehr kurz ist.

3. Im Stapelspeicher gespeicherte Variablen werden freigegeben, sobald ihr Lebenszyklus endet, während im Heap-Speicher gespeicherte Entitäten gesammelt werden von Zeit zu Zeit durch den Garbage-Collection-Mechanismus.

php Chinesische Website, eine große Anzahl kostenloser Java-Einführungs-Tutorials

, willkommen zum Online-Lernen!

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen Heap- und Stack-Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage