Was dieser Artikel Ihnen bringt, ist die Analyse (Bilder und Texte) des JVM-Speicherbereichs und der Speicherbereinigung. Ich hoffe, dass er für Sie hilfreich ist.
1. Einführung in JVM
JVM, der vollständige Name ist Java Virtual Machine, also eine virtuelle Java-Maschine. In der Programmiersprache Java geschriebene Anwendungen laufen auf der JVM. JVM ist eine Spezifikation für Computergeräte. Dabei handelt es sich um einen fiktiven Computer, der durch die Simulation verschiedener Computerfunktionen auf einem tatsächlichen Computer implementiert wird. Ein sehr wichtiges Merkmal von Java ist seine Unabhängigkeit von der Plattform, und die JVM ist der Schlüssel zur Realisierung dieser Funktion.
Die Ausführung des Programms durch die JVM ist hauptsächlich in zwei Schritte unterteilt. Der erste Schritt ist die Kompilierung, dh die Kompilierung der .java-Quelldatei in eine .class-Bytecode-Datei. Die JVM interpretiert die Bytecodedatei zur Interpretation und Ausführung. Die zweistufigen Flussdiagramme sind jeweils in den folgenden beiden Abbildungen dargestellt:
2. JVM-Speicherbereich
Das gesamte JVM-System ist in zwei Subsysteme unterteilt. Der erste ist ClassLoader, der Klassenlader. Seine Funktion besteht darin, die geschriebene Klasse in die JVM zu laden. Die zweite ist die Execution Engine, die für die Interpretation und Ausführung der kompilierten Bytecode-Dateien verantwortlich ist. Die oben erwähnte Ausführungs-Engine ist in zwei Teile unterteilt. Der erste Teil ist der Laufzeitdatenbereich, der dem Speicher in der JVM entspricht. Der zweite Teil ist die native Schnittstelle, die die lokalisierte Schnittstelle darstellt , das hauptsächlich zum Ausführen anderer Nicht-Java-Programme verwendet wird. Ein in einer Programmiersprache geschriebenes Programm.
Der entscheidende Punkt ist der ehemalige Laufzeitdatenbereich, der in fünf Teile unterteilt ist, nämlich Methodenbereich (Methodenbereich), Heap (Heap), VM-Stapel (Stapel der virtuellen Maschine) und Programmzählerregister (Programmzähler). ), Nativer Methodenstapel. Die ersten beiden Threads werden gemeinsam genutzt und die letzten drei Threads sind isoliert. Wie in der folgenden Abbildung gezeigt:
Zusammenfassend weist die JVM den Methodenbereich und den Heap zu, wenn sie zum ersten Mal ausgeführt wird Trifft er auf einen Thread, weist er das Programmzählerregister (Programmzähler), den VM-Stapel (Stapel der virtuellen Maschine) und den Stapel der nativen Methode (Stapel der lokalen Methode) zu. Wenn der Thread beendet wird, werden die drei Speicher (Stapel der virtuellen Maschine, Stapel der lokalen Methode) zugewiesen Der vom Methodenstapel und Programmzähler belegte Speicherplatz wird ebenfalls freigegeben. Dies ist auch der Grund, warum der Datenbereich in Thread-Freigabe und Thread-Isolation unterteilt ist. Der Lebenszyklus der drei Thread-isolierten Bereiche ist derselbe wie der des Threads, zu dem er gehört, und der Thread-Freigabebereich ist derselbe Lebenszyklus des ausgeführten Java-Programms, daher handelt es sich auch um Systemmüll. Der Grund dafür, dass das Recycling nur im Thread-geteilten Bereich erfolgt (tatsächlich erfolgt es bei den meisten virtuellen Maschinen auf dem Heap). Die Speicherüberlaufausnahme ist in der folgenden Abbildung dargestellt:
1. Methodenbereich (Methodenbereich)
Der Methodenbereich umfasst konstante Pool- und statische Felder. Speichert die Informationen der geladenen Klasse (Name, Modifikatoren usw.), statische Variablen der Klasse, Konstanten der Klasse, Feldinformationen der Klasse und Methodeninformationen der Klasse. Wenn Entwickler Informationen im Programm über Methoden wie getName und isInterface im Class-Objekt erhalten, stammen diese Daten aus dem Methodenbereich.
2. Heap (Heap)
Der Heap ist der größte von der JVM verwaltete Speicherbereich. Es kann davon ausgegangen werden, dass alle Objekte erstellt werden von new in Java sind Der Speicher von Objekten wird hier zugewiesen, und der Speicher von Objekten im Heap muss warten, bis GC recycelt wird.
3. Programmzählerregister (Programmzähler)
Der Programmzähler ist ein kleiner Speicherplatz, der den vom aktuellen Thread ausgeführten Bytecode anzeigt Funktioniert, wählt es den nächsten auszuführenden Bytecode-Befehl aus, indem es den Wert des Zählers ändert. Grundfunktionen wie Verzweigungen, Sprünge und Schleifen sind bei der Implementierung alle darauf angewiesen.
4. VM-Stapel (Virtual Machine Stack)
Der Stapel der virtuellen Maschine beschreibt das Speichermodell der Java-Methodenausführung Frame wird verwendet, um lokale Variablentabellen (grundlegende Datentypen, Objektreferenzen usw.), Operandenstapel, dynamische Links, Methodenrückgabeadressen und einige zusätzliche Zusatzinformationen zu speichern.
5. Nativer Methodenstapel
Dieser Bereich spielt eine sehr ähnliche Rolle wie der Stapel der virtuellen Maschine, mit der Ausnahme, dass der Stapel der virtuellen Maschine der virtuellen Maschine zum Ausführen von Java-Methoden dient und die native Methode The Der Stack bedient die verwendeten nativen Betriebssystemmethoden (Native).
3. JVM-Garbage Collection
Das GenerationalCollecting-Prinzip (Garbage Collection) von JVM besteht darin, Objekte in junge Generation (Young), alte Generation (Tenured) und persistente Generation (Perm) zu unterteilen und unterschiedliche Algorithmen für Objekte mit unterschiedlichen Lebenszyklen zu verwenden.
Normalerweise bezieht sich das JVM-Speicherrecycling immer auf das Heap-Speicherrecycling. Tatsächlich wird nur der Inhalt im Heap (Heap) dynamisch zugewiesen, sodass sich sowohl die junge als auch die alte Generation der oben genannten Objekte auf das beziehen JVM. Heap (Heap)-Speicherplatz, und die persistente Generierung ist der zuvor erwähnte Methodenbereich (Methodenbereich), der nicht zum Heap (Heap) gehört.
1. Junge Generation
Wenn eine Java-Anwendung Java-Objekte zuweist, werden diese Objekte dem Heap-Speicherplatz der jungen Generation zugewiesen
Dieser Raum besteht hauptsächlich aus kleinen Objekten und wird häufig recycelt
Da die Müllsammlung des Heapraums der jungen Generation sehr häufig sein wird, wird der Müllsammlungsalgorithmus der Recyclingeffizienz mehr Aufmerksamkeit schenken
2. Alte Generation
Langlebige Objekte im Heap-Bereich der jungen Generation werden (möglicherweise dauerhaft) in den Heap-Bereich der alten Generation
Dieser Heap-Bereich übertragen ist normalerweise größer als Der Heap-Speicherplatz der jungen Generation ist groß und seine Speicherwachstumsrate ist langsam.
Da der größte Teil des JVM-Heap-Speicherplatzes der alten Generation zugewiesen ist, benötigt sein Garbage-Collection-Algorithmus mehr Speicherplatz -Speicherung, und dieser Algorithmus muss in der Lage sein, Heap-Speicherplatz mit geringer Garbage-Dichte zu verarbeiten
3. Die persistente Generierung
speichert die Metadaten von VM und Java-Klassen sowie die Statik interner Zeichenfolgen und Klassen Variable
Wenn der Heap-Speicherplatz dieser drei Generationen knapp ist oder nicht genügend Speicherplatz für neue Anforderungen vorhanden ist, wird der Garbage-Collection-Mechanismus wirksam. Es gibt zwei Arten der Garbage Collection: Minor GC und Full GC. Wenn der Heap-Speicherplatz der jungen Generation voll ist, wird eine Sammlung ausgelöst, um verbleibende Objekte in den Heap-Speicherplatz der alten Generation zu verschieben. Wenn der Heap-Speicherplatz der alten Generation voll ist, wird eine vollständige Sammlung ausgelöst, die den gesamten Bereich des Objekt-Heaps abdeckt.
Dies ist eine kurze Analyse des JVM-Speicherbereichs und der Garbage Collection, die nur als Referenz dient.
Das obige ist der detaillierte Inhalt vonAnalyse des JVM-Speicherbereichs und der Garbage Collection (Bild und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!