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
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:MaxPermSize
Laufzeitkonstantenpool: 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 Maschinebeschreibt 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. long
double
Der 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.
ä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. HeapDer 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önnenverwenden, um die Größen von
Eden Space
undSurvivor Space
anzupassen.-XX:SurvivorRation
Eden Space
Alte 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.
Young Generation 即图中的Eden + From Space + To Space Eden 存放新生的对象 Survivor Space 有两个,存放每次垃圾回收后存活的对象 Old Generation Tenured Generation 即图中的Old Space 主要存放应用程序中生命周期长的存活对象
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
Java-Heap-Speicher wird vom Betriebssystem zugewiesen Teil des Speichers der JVM.
Wenn wir Objekte erstellen, werden sie im Java-Heapspeicher gespeichert.
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.
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.
Sie können JConsole oder Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory() verwenden, um die Größe des Heap-Speichers in Java anzuzeigen.
Sie können den Befehl „jmap“ verwenden, um den Heap-Dump zu erhalten, und „jhat“, um den Heap-Dump zu analysieren.
Java-Heap-Speicherplatz unterscheidet sich vom Stapelspeicherplatz, der zum Speichern von Aufrufstapeln und lokalen Variablen verwendet wird.
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.
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.
- 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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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

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.

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

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.

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

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.

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 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.
