Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

王林
王林nach vorne
2019-08-24 13:44:433399Durchsuche

Wir wissen, dass Sie in der C++-Sprache einen neuen Vorgang für das Objekt ausführen müssen, wenn Sie das Objekt nicht mehr verwenden möchten. Wenn der Entwickler vergisst, die Löschanweisung zu schreiben, führt dies zu einem Speicherverlust. [Wenn Speicher von einem Objekt belegt ist und nicht zurückgegeben wird, spricht man von einem Speicherverlust. 】

Aber Java ist intelligent. Es hat sich von „manuell“ zu „automatisch“ entwickelt und die Kontrolle über den Speicher an die virtuelle Maschine übergeben. Werfen wir einen Blick darauf, wie JVM die automatische Speicherverwaltung durchführt.

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Automatische Speicherverwaltung ist in zwei Teile unterteilt :

Speicher zu Objekten zuweisen und den Objekten zugewiesenen Speicher zurückgewinnen. In diesem Artikel sprechen wir über Ersteres, nämlich die Speicherpartitionierung und Speicherzuweisung. Lassen Sie uns im nächsten Artikel über GC (Garbage Collection) sprechen.

1. Speicheraufteilung

Werfen wir einen Blick auf den Speicher der virtuellen Maschine. Der Speicherbereich der JVM ist grob in Klassendateien, Klassenladesubsystem, Laufzeitdatenbereich und Ausführungs-Engine unterteilt. Heute sprechen wir nur über den Laufzeitdatenbereich. [Dieses Bild basiert auf JDK7. Vor JDK7 wurde der Konstantenpool im Methodenbereich gespeichert. Seit JDK7 wird der konstante Pool auf dem Heap platziert. 】

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Thread öffentlich

Im Laufzeitdatenbereich sind der Methodenbereich und der Heap für den Thread öffentlich, d. h. Diese beiden Bereiche werden „recycelt“ und müssen daher im Müll gesammelt werden. Es wird beim Start der virtuellen Maschine erstellt.

Thread privat

Der Stapel der virtuellen Maschine, der lokale Methodenstapel und der Programmzähler sind für den Thread privat. Sie „leben und sterben“ mit dem Thread und sind „. einmalig", sodass keine Müllsammlung erforderlich ist.

(1) Methodenbereich

speichert Klasseninformationen, Konstanten, statische Variablen, vom Just-in-Time-Compiler kompilierten Code und andere Daten von der virtuellen Maschine geladen wurde.
Es gibt einen Laufzeitkonstantenpool. Es speichert in der Klassendatei beschriebene Symbolreferenzen, direkte Referenzen. Neue Konstanten können sowohl zur Kompilierungszeit als auch zur Laufzeit in diesen Pool eingefügt werden.

(2) Heap

Konzept: Wenn der Stapel das Problem des Programmbetriebs löst, dh wie das Programm dann Daten verarbeitet; Der Heap löst Es handelt sich um ein Datenspeicherproblem, das heißt, wie und wo die Daten abgelegt werden sollen.

Funktionen:

a Der Heap ist der größte Teil des Speichers der virtuellen Maschine und macht etwa drei Viertel des Speichers aus. Wenn beispielsweise jeder Prozess auf einer 32-Bit-Windows-Plattform über 2 GB Speicher verfügt, werden dem Heap im Allgemeinen 1,5 GB Speicher zugewiesen. Es ist ersichtlich, dass der Heap viel Platz einnimmt.
b. Es kann sich im physikalisch diskontinuierlichen Speicherraum befinden, solange es logisch kontinuierlich ist.

Funktion:

Speicherobjektinstanzen, fast alle Objektinstanzen weisen hier Speicher zu.

Klassifizierung:

Aus Sicht des Speicherrecyclings wird es in die neue Generation und die alte Generation unterteilt.
Aus Sicht der Speicherzuweisung können mehrere Thread-private Zuweisungspuffer aufgeteilt werden.

(3) Stapel der virtuellen Maschine

Der Stapel der virtuellen Maschine speichert Stapelrahmen und die Stapelrahmen speichern lokale Variablentabellen. dynamischer Link, Methodenexit und andere Informationen.

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Stapelrahmen im Stapel

Jede Methode erstellt einen Stapelrahmen und eine Methode, während der Prozess ausgeführt wird Der Aufruf zum Abschluss der Ausführung entspricht dem Prozess vom Schieben eines Stapelrahmens in den Stapel der virtuellen Maschine bis zum Herausspringen desselben.

Die lokale Variablentabelle im Stapelrahmen

speichert verschiedene grundlegende Datentypen, Objektreferenzen und returnAddress-Typen, die zur Kompilierungszeit bekannt sind. Daher kann der erforderliche Speicherplatz während der Kompilierung zugewiesen werden und seine Größe ändert sich zur Laufzeit nicht.

Bei der Zuweisung des von Basisdatentypen belegten Speicherplatzes belegen die anderen Datentypen nur einen, mit Ausnahme von 64-Bit-langen Daten und Daten vom doppelten Typ, die zwei lokale Variablenbereiche belegen.

(4) Lokaler Methodenstapel

Die Funktionen des lokalen Methodenstapels und des Stapels der virtuellen Maschine sind dieselben, mit der Ausnahme, dass der Stapel der virtuellen Maschine ausgeführt wird Java-Methoden: Der native Methodenstapel führt die native Methode aus.
Die Java-Methode ist der vom Entwickler geschriebene Java-Code, und die native Methode ist eine Schnittstelle für Java zum Aufrufen von Nicht-Java-Code.

(5) Programmzähler

Der Programmzähler speichert die Zeilennummer des vom aktuellen Thread ausgeführten Bytecodes. Wenn der JVM funktioniert, wählt er den nächsten Bytecode-Befehl aus, der ausgeführt werden muss, indem er den Wert dieses Zählers ändert.

2. Speicherzuweisung

In diesem Teil sprechen wir darüber, wie Objekte im Java-Heap zugewiesen, angeordnet und darauf zugegriffen werden . Und die Prinzipien der Speicherzuweisung.

Erstellung von Objekten

Wir verwenden new, um Objekte zu erstellen neu . Zu diesem Zeitpunkt sind Menschen wie ein Stück Fleisch. Sie müssen mehrere Sicherheitskontrollen durchlaufen, bevor sie den menschlichen Esstisch erreichen können. Schritt 1: Prüfen Sie, ob im Konstantenpool eine entsprechende Symbolreferenz vorhanden ist. [Im Methodenbereich fortfahren]

Schritt 2: Überprüfen Sie, ob diese Klasse geladen, geparst und initialisiert wurde. [Weiter im Methodenbereich]

Schritt 3: Empfangen Sie den Speicher des neuen Objekts. Es gibt zwei Möglichkeiten: Zeigerkollision und freie Liste. [Im Heap fortfahren]

Schritt 4: Initialisieren Sie den zugewiesenen Speicherplatz auf den Wert Null.

Schritt 5: Nehmen Sie die erforderlichen Einstellungen für das Objekt vor, z. B. von welcher Klasse es eine Instanz ist, den Hash-Code des Objekts usw. Diese Informationen werden im Objektheader des Objekts gespeichert

Schritt 6: Wenn dem Objekt ein Anfangswert im Java-Code zugewiesen wird, wird Schritt 6 ausgeführt: Führen Sie die Methode aus. Der Zweck dieser Methode besteht darin, das Objekt zu initialisieren.

Speicherlayout von Objekten

Das Speicherlayout von Objekten im Speicher ist unterteilt in 3 Teil: Objektkopf + Instanzdaten + Ausrichtungsauffüllung

Objektkopf

Der Objektkopf enthält zwei Informationsteile:

(1 ) Laufzeitdaten, einschließlich Hash-Code, Alter der GC-Generierung, Sperrstatus-Flag usw.

(2) Typzeiger, die virtuelle Maschine verwendet diesen Zeiger, um zu bestimmen, von welcher Klasse dieses Objekt eine Instanz ist.

Instanzdaten

Instanzdaten speichern den Inhalt verschiedener im Code definierter Feldtypen.

Ausgerichtete Polsterung

Ausgerichtete Polsterung dient als Platzhalter und ist nicht unbedingt vorhanden. Es muss lediglich sichergestellt werden, dass die Größe des Objekts ein ganzzahliges Vielfaches von 8 Byte ist.

Objektzugriffsort

Nachdem wir das Objekt erstellt haben, können wir das Objekt verwenden. Wie können Sie bei der Nutzung das gesuchte Objekt finden? Es gibt zwei Möglichkeiten: Handle und direkter Zeiger

Handle:

Der Handle-Zugriff besteht darin, einen Teil des Speichers in Java zu teilen Heap Als Handle-Pool enthält das Handle die spezifischen Adressinformationen von Objektinstanzdaten und Typdaten.

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Direkter Zeiger:

Der Grund, warum der direkte Zeiger „direkt“ ist „Das liegt daran, dass die Zwischenschaltung des Griffs entfernt wird. Es ist also schneller als handhaben. In der virtuellen HotSpot-Maschine wird diese Methode verwendet.

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Nachdem wir darüber gesprochen haben, wie Objekte im Java-Heap zugewiesen, angeordnet und darauf zugegriffen werden, sprechen wir über die Prinzipien der Speicherzuweisung der Speicherzuordnung:

Detaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung

Der Heap ist grob in die neue Generation unterteilt, die alte Generation und die bleibende Generation. Die Speicherzuweisung von Objekten erfolgt hauptsächlich im Eden-Bereich der neuen Generation und in einigen Fällen direkt der alten Generation. Die Zuordnungsregeln sind nicht zu 100 % festgelegt und hängen von der Garbage-Collector-Kombination und den Parametereinstellungen ab. Im Folgenden finden Sie mehrere Zuteilungsgrundsätze als Referenz. (1) Objekte werden zuerst in Eden zugewiesen.

(2) Große Gegenstände gelangen direkt ins Alter.

(3) Langfristig überlebende Objekte werden in die alte Generation übergehen.

(4) Altersbestimmung dynamischer Objekte.

(5) Platzzuteilungsgarantie.

Das Obige ist die Speicheraufteilung in der virtuellen JAVA-Maschine. Für weitere Fragen besuchen Sie bitte die chinesische PHP-Website:

JAVA-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der JAVA Virtual Machine (JVM) (2) – Speicheraufteilung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen