Heim >Java >javaLernprogramm >Teilen Sie eine Zusammenfassung der Java-Speicherverteilung

Teilen Sie eine Zusammenfassung der Java-Speicherverteilung

Y2J
Y2JOriginal
2017-04-28 10:09:461568Durchsuche

In diesem Artikel wird hauptsächlich die detaillierte Erklärung der Speicherverteilung beim Ausführen eines Java-Programms vorgestellt. Freunde, die es benötigen, können sich auf

Java-Speicherverteilung beziehen: Die Java Virtual Machine wird den Speicher verwalten verwaltet ist in verschiedene Datenbereiche unterteilt: Methodenbereich, Stapel virtueller Maschinen, lokaler Methodenstapel, Heap und Programmzähler.

1. Der Programmzähler ist ein kleiner Speicherplatz, der den vom aktuellen Thread ausgeführten Bytecode anzeigt. Im konzeptionellen Modell der virtuellen Maschine ändert der Bytecode-Interpreter den Wert dieses Zählers, um eine Bytecode-Anweisung auszuwählen, die ausgeführt werden muss.

Grundlegende Funktionen wie Verzweigung, Schleife, Springen, Ausnahmebehandlung und Thread-Wiederherstellung sind alle auf diesen Zähler angewiesen, um ausgeführt zu werden.

Um nach dem Thread-Wechsel zur korrekten Ausführungsposition zurückzukehren, muss jeder Thread über einen unabhängigen Programmzähler verfügen. Die Zähler zwischen den einzelnen Threads beeinflussen sich nicht gegenseitig und werden unabhängig voneinander gespeichert, also diese Art von Speicherbereich ist „Thread privater“ Speicher.

Wenn der Thread eine Java-Methode ausführt, zeichnet dieser Zähler die Adresse der ausgeführten Bytecode-Anweisung der virtuellen Maschine auf. Wenn der Thread eine native Methode ausführt, ist der Zählerwert leer und dieser Speicherbereich ist der einziger Bereich, in dem die Java Virtual Machine Specification keine OutOfMemoryError-Bedingungen angibt.

2. Java Virtual Machine Stack

Wie der Programmzähler ist auch der Java Virtual Machine Stack Thread-privat und sein Lebenszyklus ist der gleiche wie der von der Thread. Der Stapel der virtuellen Maschine beschreibt das Speichermodell der Java-Methodenausführung. Wenn jede Methode ausgeführt wird, wird ein Stapelrahmen erstellt, um Informationen wie lokale Variablentabellen, Operandenstapel, dynamische Links, Methodenausgänge usw. zu speichern.

Jede Methode, vom Aufruf bis zum Abschluss der Ausführung, entspricht dem Prozess, bei dem ein Stapelrahmen in den Stapel der virtuellen Maschine verschoben und dann aus dem Stapel entnommen wird.

Die lokale Variablentabelle speichert verschiedene grundlegende Datentypen, Objektverweise (nicht gleichbedeutend mit Objekten, sondern Verweise auf Objekte) und returnAddress-Typen, die zur Kompilierungszeit bekannt sind. Wenn die vom Thread angeforderte Stapeltiefe größer ist als die von der virtuellen Maschine zugelassene Tiefe, wird eine StackOverflowError-Ausnahme ausgelöst. Wenn nicht genügend Speicher beantragt werden kann, wird eine

OutOfMemory

-Ausnahme ausgelöst.

3. Lokaler Methodenstapel

Der Unterschied zwischen dem lokalen Methodenstapel und dem virtuellen Maschinenstapel besteht darin, dass der virtuelle Maschinenstapel das von der ausgeführte Java (Bytecode) bereitstellt virtuelle Maschine und der lokale Methodenstapel bedient die von der virtuellen Maschine verwendeten nativen Methoden.

4. Java-Heap

Der Java-Heap ist ein von allen Threads gemeinsam genutzter Speicherbereich und wird beim Start der virtuellen Maschine erstellt. Der einzige Zweck dieses Speicherbereichs besteht darin, Objektinstanzen zu speichern. Der Java-Heap ist der Hauptbereich, der vom Garbage Collector verwaltet wird.

Methodenbereich ist dasselbe wie der Java-Heap. Es handelt sich um einen von jedem Thread gemeinsam genutzten Speicherbereich, in dem vom Just-in-Time-Compiler geladene Daten wie Klasseninformationen, Konstanten, statische Variablen und Code gespeichert werden virtuelle Maschine.

6. Laufzeitkonstantenpool

Der Laufzeitkonstantenpool ist Teil des Methodenbereichs. Zusätzlich zu den Beschreibungsinformationen der Klassenversion, Feldern, Methoden, Schnittstellen usw. verfügt die Klassendatei auch über einen Konstantenpool, der zum Speichern verschiedener Literale und Symbolreferenzen verwendet wird, die während der Kompilierung generiert werden Anschließend wird es im Laufzeitkonstantenpool im Methodenbereich gespeichert.

Viele Erklärungen zu konstanten Pools im Internet verwenden Zeichenfolgen als Beispiele:

Zum Beispiel ist

s1==s2 wahr, was leicht zu verstehen ist. Zeigt auf die Speicheradresse desselben Konstantenpools.

s1==s3 ist wahr: Da für s3 alle Verkettungen Literale sind, optimiert der Compiler, was eigentlich s3="Hallo" bedeutet.

s1== s4 ist falsch: Da neu String("lo") ist kein Literal, sondern eine Variable. Der Compiler führt keine Optimierung durch, da sich die Variable ändern kann.
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
 
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // true
System.out.println(s1 == s4); // false
System.out.println(s1 == s9); // false
System.out.println(s4 == s5); // false
System.out.println(s1 == s6); // true

s1==s9 ist falsch: das Gleiche wie oben.

s4==s5: Die Referenzen zweier verschiedener Objekte sind natürlich unterschiedlich.

s1==s6: Da die Methode

String.intern()

bedeutet: Wenn der Konstantenpool bereits einen String enthält, der diesem String-Objekt entspricht (das Objekt wird durch

equal dargestellt). (Objekt)

Methode bestimmt), dann wird die Zeichenfolge im Pool zurückgegeben. Andernfalls wird dieses String-Objekt dem Pool hinzugefügt und ein Verweis auf dieses String-Objekt zurückgegeben. Daraus folgt, dass für zwei beliebige Zeichenfolgen s und t s.intern() == t.intern() genau dann wahr ist, wenn s.equals(t) wahr ist.

Das obige ist der detaillierte Inhalt vonTeilen Sie eine Zusammenfassung der Java-Speicherverteilung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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