Was ist JVM (Java Virtual Machine)?

Was ist JVM (Java Virtual Machine)?

--JVM ist eine Abkürzung für Java Virtual Machine, eine Software, die zum Ausführen von Java-Programmen erforderlich ist.

Es kann unabhängig vom CPU- oder Betriebssystemtyp ausgeführt werden. Mit anderen Worten, in dem Prozess, der auf dem Betriebssystem ausgeführt wird, wird der durch Kompilieren des Java-Codes erhaltene Bytecode in eine Maschinensprache konvertiert, die das entsprechende Betriebssystem (Windows, OS X, Linux usw.) verstehen (analysieren) und ausführen kann.

JVM für verschiedene Betriebssysteme

Untitled.png

JVM-Konfiguration

Wenn Sie es allgemein betrachten, gibt es die folgenden vier.

JVM-Konfiguration

Untitled (1).png

Class Loader

Wenn Sie in Java einen Quellcode erstellen, wird eine Java-Datei wie Test.java generiert. Wenn der Java-Compiler die Java-Quelle kompiliert, wird eine .class-Datei (Bytecode) wie Test.class generiert. Der Class Loader spielt die Rolle, die auf diese Weise generierte ** Class-Datei zusammenzustellen und den ** Runtime Data Area ** zu laden, den vom Betriebssystem angegebenen Speicherbereich.

Execution Engine

Garbage Collector

Runtime Data Area

Struktur des Laufzeitdatenbereichs

캡처.PNG

Method area

Heap area

Stack area

PC Register

--Hält den Programmzähler, einen Zeiger auf die aktuelle Anweisung, die innerhalb des Threads ausgeführt wird, in dem Bereich, der jedes Mal erstellt wird, wenn ein Thread erstellt wird. (* Unterschiedlich zu CPU-Registern) --Wenn die aktuell ausgeführte Methode "nativ" ist, ist der Wert des Programmzählerregisters undefiniert.

Native method stack

Wenn der Thread erstellt wird

Alle Threads teilen sich den Methodenbereich und den Heap-Bereich Der Stapelbereich, die PC-Register und der native Methodenstapel werden für jeden Thread erstellt und nicht gemeinsam genutzt.

Heap area & Garbage Collector In diesem Artikel ist der Heap-Bereich ein wichtiges Ziel von GC. Schauen wir uns das genauer an. (Stapelbereich und Methodenbereich unterliegen ebenfalls der GC.)

Der Heap-Bereich besteht aus 5 Bereichen (Eden, Survivor1, Survivor2, Old, Permanent).

Bis JDK7 war der permanente Bereich im Heap vorhanden. Aus JDK8 ist der permanente Bereich verschwunden und ein Teil davon wurde in den "Meta-Space-Bereich" geändert. (Die obige Abbildung basiert auf JDK7.) Der Meta-Space-Bereich ist jetzt im Native-Stack-Bereich enthalten.

(Es ist wichtig, dass die Zahlen im Überlebensbereich bedeutungslos und zweigeteilt sind.)

Der Grund, warum der Heap-Bereich in 5 unterteilt ist, besteht darin, dass die GC effizient arbeitet. Ich möchte die Details erklären, während ich den Prozess der GC beobachte.

GC ist in Minor GC und Major GC unterteilt

* Minor GC: GC wird im neuen Bereich durchgeführt

  1. Wenn das Objekt zum ersten Mal erstellt wird, wird es im Bereich Eden erstellt.
  2. Der erste GC wird durchgeführt, wenn der Eden-Bereich voller Objekte ist.
  3. Die Erinnerung an den Eden-Bereich wird unverändert in den Survivor1-Bereich kopiert. Löschen Sie dann die Objekte in den anderen Bereichen außer dem Bereich "Survivor1".
  4. Wenn sowohl der Eden-Bereich als auch der Survivor1-Bereich voll sind, suchen Sie nach den im Eden-Bereich generierten Objekten und den im Survivor1-Bereich generierten Objekten, auf die verwiesen wird.
  5. Lassen Sie die nicht referenzierten Objekte unverändert und kopieren Sie nur die referenzierten Objekte in den Bereich Survivor2.
  6. Löschen Sie die Objekte in den anderen Bereichen außer dem Bereich Survivor2.
  7. Objekte, auf die im obigen Ablauf mehr als eine bestimmte Anzahl von Malen verwiesen wurde, werden vom Überlebenden2 in den alten Bereich verschoben.

* Major GC (Full GC): GC wird im alten Bereich durchgeführt

  1. Überprüfen Sie alle Objekte im alten Bereich, um festzustellen, ob auf sie verwiesen wird.
  2. Sammeln Sie nicht referenzierte Objekte und löschen Sie sie alle gleichzeitig.

Was ist, wenn Major GC (Full GC) durchgeführt wird? ??

Überprüft nicht referenzierte Objekte im Bereich Alt und löscht alle zutreffenden Objekte. In diesem Fall wird es im Heap-Speicherbereich gelöscht und freier Speicherplatz erstellt. Es wird jedoch eine Neukonfiguration durchgeführt, um diesen freien Speicher zu entfernen. (Speicherorganisation) ** Daher werden alle Threads gestoppt, um zu verhindern, dass andere Threads den Speicher verwenden, während der Speicher neu konfiguriert wird. ** **.

Referenz

Recommended Posts

Was ist JVM (Java Virtual Machine)?
Was ist java
Was ist Java <>?
Was ist java
Was ist Java-Kapselung?
Was ist Java-Technologie?
Was ist Java API-Java?
[Java] Was ist flatMap?
[Java] Was ist ArrayList?
Was ist Java Assertion? Zusammenfassung.
Was ist eine Java-Sammlung?
[Java] Was ist jaee j2ee?
[Java] Was ist Klassenvererbung?
[Java-Grundlagen] Was ist Klasse?
Was ist Java-Fluchtanalyse?
Was ist Thread-sicher (mit Java)
[Java] Was ist die Ausnahme für gleichzeitige Änderungen?
Was ist ein Lambda-Ausdruck (Java)
Was ist eine Klasse in der Java-Sprache (3 /?)
Was ist das beste Lesen von Dateien (Java)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist Java und Entwicklungsumgebung (MAC)
Was ist eine Klasse in der Java-Sprache (2 /?)
Was ist die Hauptmethode in Java?
Was ist Cubby?
[Java] JVM-Konfiguration
Was ist null? ]]
Was ist Schlüsselumhang?
Was ist Maven?
Was ist Jackson?
Was ist Selbst
Was ist Jenkins?
Was ist ArgumentMatcher?
Was ist IM-Jonglieren?
Was ist params
Was ist SLF4J?
Was ist Fassade? ??
Was ist Gradle?
Was ist POJO?
Was ist centOS?
Was ist RubyGem?
Was ist before_action?
Was ist Docker?
Was ist Byte?
Was ist Tomcat?
Was ist das Java Servlet / JSP MVC-Modell?
Was ist der flüchtige Modifikator für Java-Variablen?
Java State Machine Auto
Was ist Maven Assembly?
Was ist Docker-Compose?
Was ist ein Konstruktor?
Was ist vue cli
Was ist eine Schnittstelle?
Was ist Rubys Selbst?
Was ist harte Codierung?
Was ist ein Stream?
Was ist Rubys attr_accessor?