1: Java-Technologiesystemmoduldiagramm
2: JVM-Speicherbereichsmodell
1. Methodenbereich
wird auch als „permanente Generation“ und „Nicht-Heap“ bezeichnet. Es wird zum Speichern von Klasseninformationen, Konstanten und statischen Variablen verwendet, die von der virtuellen Maschine geladen werden. Es handelt sich um jeden von Threads gemeinsam genutzten Speicherbereich . Der standardmäßige Mindestwert beträgt 16 MB und der Höchstwert 64 MB. Sie können die Größe des Methodenbereichs über die Parameter -XX:PermSize und -XX:MaxPermSize begrenzen.
Laufzeitkonstantenpool: Er ist Teil des Methodenbereichs. Zusätzlich zu den Beschreibungsinformationen wie Klassenversion, Feldern, Methoden, Schnittstellen usw. verfügt die Klassendatei auch über eine Konstantenpool. Wird zum Speichern verschiedener vom Compiler generierter Symbolreferenzen verwendet. Dieser Inhalt wird nach dem Laden der Klasse im Laufzeitkonstantenpool abgelegt.
2. Der virtuelle Maschinenstapel
beschreibt das Speichermodell der Java-Methodenausführung: Wenn jede Methode ausgeführt wird, wird ein „Stapelrahmen“ erstellt, um Informationen wie lokale Variablentabellen (einschließlich Parameter), Operationsstapel und Methodenausgänge zu speichern. Der Prozess vom Aufruf jeder Methode bis zum Abschluss der Ausführung entspricht dem Prozess eines Stapelrahmens vom Schieben in den Stapel bis zum Herausspringen aus dem Stapel im Stapel der virtuellen Maschine. Der Deklarationszyklus ist derselbe wie der Thread und privat für den Thread.
Die lokale Variablentabelle speichert verschiedene grundlegende Datentypen, die dem Compiler bekannt sind (boolean, byte, char, short, int, float, long, double), Objektreferenzen (Referenzzeiger usw.). das Objekt selbst), die 64-Bit langen und doppelten Datentypen belegen den Platz von 2 lokalen Variablen, und die anderen Datentypen belegen nur 1 Platz. Der für die lokale Variablentabelle erforderliche Speicherplatz wird während der Kompilierung zugewiesen. Die Größe der lokalen Variablen, die die Methode im Stapelrahmen zuweisen muss, wird vollständig bestimmt Variablentabelle während der Laufzeit.
3. Der lokale Methodenstapel
ähnelt im Wesentlichen dem virtuellen Maschinenstapel ist der von der virtuellen Maschine ausgeführte Java-Methodendienst, während der lokale Methodenstapel native Methoden bereitstellt.
4. Heap
Neue vom Programm erstellte Objekte sind alle from Die neue Generation weist Speicher zu. Die neue Generation besteht aus Eden Space und zwei Survivor Spaces gleicher Größe (normalerweise auch S0 und S1 oder From und To genannt). Die Größe der neuen Generation kann über den Parameter -Xmn angegeben werden. oder -XX: SurvivorRation, um die Größe vonAuch Java-Heap genannt, ist der GC-Heap der größte von der Java Virtual Machine verwaltete Speicher Beim Start der JVM wird ein Speicherbereich erstellt, der von verschiedenen Threads gemeinsam genutzt wird . In diesem Speicherbereich werden Objektinstanzen und Arrays (alle neuen Objekte) gespeichert. Die Größe wird durch die Parameter -Xms (Minimalwert) und -Xmx (Maximalwert) festgelegt. -Xms ist der minimale Speicher, der beim Start der JVM angefordert wird > Der Standardwert beträgt 1/64 des physischen Speichers des Betriebssystems, jedoch weniger als 1 GB. -Xmx ist der maximale Speicher, den die JVM beantragen kann. Der Standardwert beträgt 1/4 des physischen Speichers, jedoch weniger Der Standardwert ist, wenn der freie Heap-Speicher weniger als 40 % beträgt. Sie können dieses Verhältnis über -XX:MinHeapFreeRation= angeben Wenn der freie Heap-Speicher größer als 70 % ist, reduziert die JVM die Heap-Größe auf . Die durch -Xms angegebene Größe kann durch XX:MaxHeapFreeRation= angegeben werden, um häufige Anpassungen zu vermeiden der Heap-Größe zur Laufzeit, normalerweise -Xms und -Xmx. Die Werte werden auf die gleichen Werte gesetzt. Da Collectors jetzt Generations-Collection-Algorithmen verwenden, wird der Heap in die neue Generation und die alte Generation unterteilt. Die neue Generation speichert hauptsächlich neu erstellte Objekte und Objekte, die noch nicht in die alte Generation eingetreten sind. Die alte Generation speichert Objekte, die mehrere kleinere GCs überstanden haben.
Neue Generation:
Eden Space und Survivor Space anzupassen.
Alte Generation:
wird zum Speichern von Objekten verwendet, die mehrere GCs der neuen Generation überstanden haben, z. B. Cache-Objekte. Es gibt zwei Hauptsituationen: ①. Für große Objekte können Sie den Startparameter -XX:PretenureSizeThreshold = 1024 (Einheit ist Bytes, Standard ist 0) festlegen, um anzugeben, dass bei Überschreitung der Größe nicht in der neuen Generation, sondern direkt zugewiesen wird die alte Generation. ② Bei großen Array-Objekten gibt es keine externen Objekte, auf die im Array verwiesen wird.
Die von der alten Generation belegte Speichergröße ist der Wert, der -Xmx entspricht, abzüglich des Werts, der -Xmn entspricht.
5. Programmzähler
ist der kleinste Speicherbereich. Seine Funktion ist der Zeilennummernindikator des vom aktuellen Thread ausgeführten Bytecodes. Im virtuellen Maschinenmodell ändert der Bytecode-Befehl den Wert dieses Zählers Bei der Ausführung müssen grundlegende Funktionen wie Verzweigung, Schleife, Ausnahmebehandlung, Thread-Wiederherstellung usw. auf Zähler angewiesen sein.
Drei: Direktes Gedächtnis
Direkter Speicher ist weder Teil des Speichers der virtuellen Maschine noch ein in der Java Virtual Machine-Spezifikation definierter Speicherbereich. Das neu hinzugefügte NIO in jdk1.4 führt die IO-Methode für Kanal und Puffer ein. Es kann die native Methode aufrufen, um Off-Heap-Speicher direkt zuzuweisen und keinen Einfluss auf die Größe des Heap-Speichers zu haben .
Das Obige ist der Inhalt des Java Virtual Machine Learning – Architektur und Speichermodell. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!