Inhaltsverzeichnis
1. Einführung in die Java-Speicherkomposition: 堆(Heap) und 非堆(Non-heap) Speicher
3. Direkter Speicher
4. 10 Punkte zum Java-Heap-Speicher
Heim Java JavaBase Die interne Struktur und der Betriebsmechanismus von JVM

Die interne Struktur und der Betriebsmechanismus von JVM

Jun 16, 2020 pm 04:23 PM
java jvm

Die interne Struktur und der Betriebsmechanismus von JVM

1. Einführung in die Java-Speicherkomposition: 堆(Heap) und 非堆(Non-heap) Speicher

Entsprechend zur Aussage des Beamten: „Die Java Virtual Machine verfügt über einen Heap, das ist der Laufzeitdatenbereich, aus dem Speicher für alle Klasseninstanzen und Arrays zugewiesen wird.

Der Heap wird erstellt, wenn die Java Virtual Machine startet .“ „Der Speicher außerhalb des Heaps in der JVM wird als Nicht-Heap-Speicher (Nicht-Heap-Speicher) bezeichnet. Es ist ersichtlich, dass JVM hauptsächlich zwei Arten von Speicher verwaltet: Heap und Nicht-Heap .

Einfach ausgedrückt ist der Heap der Speicher, auf den Java-Code zugreifen kann und der für Entwickler reserviert ist. Der Nicht-Heap ist der Speicher, der für die JVM zur eigenen Verwendung reserviert ist, also der für den Methodenbereich erforderliche Speicher, JVM-intern Verarbeitung oder Optimierung (z. B. JIT-Cache für kompilierten Code), jede Klassenstruktur (z. B. Laufzeitkonstantenpool, Feld- und Methodendaten) sowie der Code von Methoden und Konstruktoren befinden sich im Nicht-Heap-Speicher.

2. JVM-Speicherbereichsmodell

Die interne Struktur und der Betriebsmechanismus von JVM

1 🎜> Wird auch als „permanente Generation“ und „Nicht-Heap“ bezeichnet und dient zum Speichern von Klasseninformationen, Konstanten und statischen Variablen, die von der virtuellen Maschine geladen werden. Es handelt sich um einen von jedem Thread 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 und begrenzen. -XX:PermSize-XX:MaxPermSizeLaufzeitkonstantenpool: Er ist Teil des Methodenbereichs, dessen Hauptinhalt aus dem Laden der Klasse durch die JVM stammt.

Zusätzlich zu den Beschreibungsinformationen wie Klassenversion, Feldern, Methoden, Schnittstellen usw. verfügt die Klassendatei auch über einen Konstantenpool, der zum Speichern verschiedener vom Compiler generierter Symbolreferenzen verwendet wird wird in besprochen. Nachdem die Klasse geladen wurde, wird sie im Laufzeitkonstantenpool im Methodenbereich platziert.

2. Der Stapel der virtuellen Maschine

beschreibt das Speichermodell der Java-Methodenausführung: Wenn jede Methode ausgeführt wird, wird ein „Stapelrahmen“ für die Speicherung der lokalen Variablentabelle erstellt (einschließlich Parameter), Operationsstapel, Methodenexit und andere Informationen. 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 für den Thread privat.

Die lokale Variablentabelle speichert verschiedene grundlegende Datentypen, die dem Compiler bekannt sind (

,

, boolean, byte, char, short, int, float), Objektreferenz (Referenzzeiger, nicht das Objekt selbst), wobei die 64-Bit-langen und doppelten Datentypen den Platz von 2 lokalen Variablen belegen, während die anderen Datentypen nur 1 belegen. longdoubleDer für die lokale Variablentabelle erforderliche Speicherplatz wird während der Kompilierung zugewiesen. Bei der Eingabe einer Methode wird vollständig bestimmt, wie viele lokale Variablen diese Methode im Stapelrahmen zuweisen muss Größe der lokalen Variablentabelle.

3. Der lokale Methodenstapel

ähnelt im Wesentlichen dem Stapel der virtuellen Maschine. Der Unterschied besteht darin, dass der Stapel der virtuellen Maschine die von der virtuellen Maschine ausgeführten Java-Methoden bedient , während der lokale Methodenstapel darin besteht, native Methoden bereitzustellen.

4. Heap

Der GC-Heap, auch Java-Heap genannt, ist der größte Speicherbereich im von der Java Virtual Machine verwalteten Speicher und ist auch der gemeinsam genutzte Speicher Jeder Thread wird beim Start der JVM erstellt. In diesem Speicherbereich werden Objektinstanzen und Arrays (alle neuen Objekte) gespeichert.

Die Größe wird über die Parameter

(Mindestwert) und

(Höchstwert) festgelegt. -Xms ist der beim Start der JVM angeforderte Mindestspeicher Der physische Speicher des Systems beträgt jedoch weniger als 1 GB. -Xms ist der maximale Speicher, den die JVM beantragen kann. Der Standardwert beträgt 1/4 des physischen Speichers, jedoch weniger als 1 GB. Standardmäßig beträgt der freie Heap-Speicher weniger als 40 %. , die JVM erhöht den Heap auf die durch -Xmx angegebene Größe. Sie können -Xmx übergeben, um dieses Verhältnis anzugeben. Wenn der freie Heap-Speicher größer als 70 % ist, reduziert die JVM die Heap-Größe auf die durch -Xms. Sie können dieses Verhältnis für das laufende System angeben, um zu vermeiden, dass die Heap-Größe während der Laufzeit häufig angepasst wird . -Xmx-XX:MinHeapFreeRation=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. XX:MaxHeapFreeRation=

Neue Generation: Neue vom Programm erstellte Objekte belegen Speicher der neuen Generation. Die neue Generation besteht aus

und zwei Teilen gleicher Größe
(normalerweise auch S0 und S1 genannt). oder Von und Bis) können Sie den Parameter -Xmn verwenden, um die Größe der neuen Generation anzugeben, oder Sie können

verwenden, um die Größen von Eden Space und Survivor Space anzupassen. -XX:SurvivorRationEden SpaceAlte Generation: Wird zum Speichern von Objekten verwendet, die mehrere Male der GC der neuen Generation überlebt haben, z. B. Cache-Objekte. Es gibt zwei Hauptsituationen: Survivor Space

1. Große Objekte können durch Startparameter -XX:PretenureSizeThreshold=1024 (Einheit ist Bytes, Standard ist 0) festgelegt werden, um anzuzeigen, dass das Objekt, wenn es die Größe überschreitet, nicht in der neuen Generation zugewiesen wird, sondern direkt zugewiesen wird in der alten Generation.

2. 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, minus dem Wert, der -Xmn entspricht.

Die interne Struktur und der Betriebsmechanismus von JVM

Young Generation        即图中的Eden + From Space + To Space
Eden                    存放新生的对象
Survivor Space          有两个,存放每次垃圾回收后存活的对象
Old Generation          Tenured Generation 即图中的Old Space 
                        主要存放应用程序中生命周期长的存活对象
Nach dem Login kopieren

5. Der Programmzähler

ist der kleinste Speicherbereich Seine Funktion ist der Zeilennummernindikator des vom aktuellen Thread ausgeführten Bytecodes. Im virtuellen Maschinenmodell wählt der Bytecode-Interpreter den nächsten auszuführenden Bytecode aus, indem er den Wert dieses Zählers ändert, wenn er arbeitet , Verzweigungen, Schleifen, Ausnahmebehandlung und Thread-Wiederherstellung basieren alle auf Zählern.

3. Direkter Speicher

Direkter Speicher ist weder Teil des virtuellen Maschinenspeichers noch ein in Java Virtual definierter Speicherbereich Maschinenspezifikation. 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 .

4. 10 Punkte zum Java-Heap-Speicher

  1. Java-Heap-Speicher wird vom Betriebssystem zugewiesen Teil des Speichers der JVM.

  2. Wenn wir Objekte erstellen, werden sie im Java-Heapspeicher gespeichert.

  3. Um die Speicherbereinigung zu erleichtern, ist der Java-Heapspeicher in drei Teile unterteilt Bereiche, jeweils New Generation, Old Generation oder Tenured Generation genannt, und Perm Space.

  4. Sie können die Größe des Java-Heap-Speicherplatzes anpassen, indem Sie die JVM-Befehlszeilenoptionen -Xms, -Xmx, -Xmn verwenden. Vergessen Sie nicht, nach der Größe „M“ oder „G“ hinzuzufügen, um die Einheit anzugeben. Sie können beispielsweise -Xmx256m verwenden, um die maximale Heap-Größe auf 256 MB festzulegen.

  5. Sie können JConsole oder Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory() verwenden, um die Größe des Heap-Speichers in Java anzuzeigen.

  6. Sie können den Befehl „jmap“ verwenden, um den Heap-Dump zu erhalten, und „jhat“, um den Heap-Dump zu analysieren.

  7. Java-Heap-Speicherplatz unterscheidet sich vom Stapelspeicherplatz, der zum Speichern von Aufrufstapeln und lokalen Variablen verwendet wird.

  8. Der Java Garbage Collector wird verwendet, um den von toten Objekten (nicht mehr verwendeten Objekten) belegten Speicher zurückzugewinnen und ihn dann im Java-Heap-Speicher freizugeben.

  9. Wenn Sie auf java.lang.outOfMemoryError stoßen, seien Sie nicht nervös. Manchmal reicht es aus, nur den Heap-Speicherplatz zu vergrößern, aber wenn es häufig vorkommt, müssen Sie sich das Java-Programm ansehen . Es liegt kein Speicherverlust vor.

  10. Bitte verwenden Sie Profiler und Heap-Dump-Analysetools, um den Java-Heap-Speicherplatz anzuzeigen und zu sehen, wie viel Speicher jedem Objekt zugewiesen ist.

Weitere verwandte Kenntnisse finden Sie in der Spalte Java Basic Tutorial

Das obige ist der detaillierte Inhalt vonDie interne Struktur und der Betriebsmechanismus von JVM. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

PHP vs. Python: Verständnis der Unterschiede PHP vs. Python: Verständnis der Unterschiede Apr 11, 2025 am 12:15 AM

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

See all articles