堆(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.
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 .
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!