1. Übersicht
Die java virtuelle Maschine unterteilt den Speicher, den er verwaltet hat, in verschiedene Datenbereiche, um das Java -Programm auszuführen. Der vom Java Virtual Machine verwaltete Speicher enthält die folgenden Bereiche der Laufzeit, wie in der folgenden Abbildung gezeigt:
Das Folgende wird in jedem Bereich erklärt.
Zweitens kann der Programmzähler <br /> Programmzähler <br /> als Zeilennummernanzeige für den vom aktuellen Thread ausgeführten Byte -Code angesehen werden. In dem Konzeptmodell der virtuellen Maschine besteht die Arbeit mit Arbeitscode -Interpretern darin, die Byte -Code -Anweisungen auszuwählen, die durch Ändern der Werte des Programmzählers ausgeführt werden müssen. Die Wiederherstellung von Threads und andere grundlegende Funktionen müssen alle auf diesen Zähler verlassen, um sie zu vervollständigen.
Um in Multi -Threaded zu ermöglichen, dass der Thread in die richtige Ausführungsposition zurückkehrt, muss jeder Thread ein unabhängiges Programmierer haben.
Wenn der Thread ausgeführt wird, ist eine Java -Methode, in der die Adresse des Byte -Codes -Anweisungen des virtuellen Maschine ausgeführt wird.
Dieser Speicherbereich ist der einzige Bereich, in dem kein OutofMemoryError angegeben ist.
Java Virtual Machine Stack
Der Java Virtual Machine Stack ist ebenfalls privat und sein Lebenszyklus ist der gleiche wie Threads. Der Virtual Machine Stack beschreibt das von der Java -Methode ausgeführte Speichermodell: Jede Methode erstellt einen Stapelrahmen, um lokale variable Tabellen zu speichern, Stapel, dynamische verknüpfte Listen, Methodenexportinformationen usw. zu betreiben. Nach dem Aufrufen von Aufrufen bis zum Abschlussprozess entspricht er dem Eingeben des Stapels in einem virtuellen Maschinenstapel zum Stapel.
In der lokalen variablen Tabelle werden im Compiler verschiedene grundlegende Datentypen (Boolesche, Byte, char, Short, Float, Long, Double), Objektreferenzen und ReturnAddress -Typen gespeichert.
Wenn Sie während der Erweiterung nicht ausreichend Speicher beantragen können, wird die Ausnahme von OutofMemoryError ausgelöst.
Der lokale Method -Stack <BR /> Local Method Stack ähnelt der virtuellen Maschine. . Einige virtuelle Maschinen kombinieren direkt den lokalen Methodenstapel und den virtuellen Maschinenstapel zu einem.
Werfen Sie Stackoverflowerror und OutofMemoryError -Anomalien.
Java -Stapel
Der Java -Stapel ist ein Speicherbereich, der von allen Threads geteilt wird.
Der Java -Stapel ist der Hauptbereich des Müllsammlermanagements. Da der Sammler im Grunde genommen für die Aufteilung des Recyclingalgorithmen verwendet wird, kann auch der Java -Stapel unterteilt werden als: die neue Generation und das Alter. Aus der Sicht der Speicherverteilung kann der Thread -stammende Java -Stapel mehrere privat verteilte Puffer (TLAB) teilen.
Der Java -Stapel kann sich in einem physischen diskontinuierlichen Speicherraum befinden, solange er logisch kontinuierlich ist. In Bezug auf die Implementierung kann es nicht nur eine feste Größe oder Erweiterung erreichen.
Wenn auf dem Haufen keine Vervollständigungsinstanzverteilung vorhanden ist und der Stapel nicht abgeschlossen werden kann, wird das OutofMemoryError weggeworfen.
Methodenbereich
Der Methodenbereich ist ein Speicherbereich, der von verschiedenen Threads geteilt wird.
Relativ gesehen sind Verhaltensweisen für die Müllsammlung in diesem Bereich selten aufgetreten, aber es gibt nicht dauerhaft im Methodenbereich der Eingabe des Datenbereichs.
Wenn der Methodenbereich die Bedürfnisse der Speicherverteilung nicht erfüllen kann, wird das OutofMemoryError ausgeworfen.
Laufender konstanter Pool:
Es ist Teil des Methodenbereichs, mit dem verschiedene Typen und Symbolreferenzen gespeichert werden, die durch die Kompilierungsperiode erzeugt werden.
Direkter Speicher
Der direkte Speicher ist nicht Teil des Datenbereichs, wenn die virtuelle Maschine in der NIO -Klasse ausgeführt wird.
Die direkte Speicherzuweisung wird nicht durch die Größe des Java -Stapels begrenzt, sondern durch die Größe des Speichers begrenzt, und alle können auch eine Ausnahme von MemoryRror auswerfen.
Drittens die Erstellung, das Layout und der Zugriff von Objekten
Objekterstellung
Das Erstellen eines Objekts erfordert normalerweise das neue Schlüsselwort. Wenn der entsprechende Klassenbelastungsprozess ausgeführt wird.
Nachdem die Klasse geladen wurde, verteilt die virtuelle Maschine neue Schüler Speicher. Die Aufgabe, Raum für das Objekt zuzuweisen, ist gleichbedeutend mit der Aufteilung eines von der Größe des Java -Stapels bestimmten Gedächtnisses. Es gibt zwei Möglichkeiten, eine Zeigerkollision zuzuweisen. Ein anderer Name ist leere Liste: Wenn der Speicher im Java -Stapel nicht regelmäßig ist, muss die virtuelle Maschine eine Liste verwalten, die aufgezeichnet wird, welcher Speicherblock verfügbar ist. Objektinstanz. Welche Verteilungsmethode wird dadurch bestimmt, ob der Java -Haufen reguliert wird und ob der Java -Haufen dadurch bestimmt wird, ob der Müllsammler mit Komprimierung und Organisationsfunktion verwendet wird. Ein weiteres Problem, das berücksichtigt werden muss, ist das Problem der Thread -Sicherheit, wenn das Objekt erstellt wird. des Gedächtnisses (TLAB) im Java -Stapel.
Nach Abschluss der Speicherverteilung muss die virtuelle Maschine den verteilten Speicherplatz auf Null -Wert initialisieren. Dieser Schritt stellt sicher, dass das Instanzfeld des Objekts ohne den Anfangswert direkt im Java -Code verwendet werden kann.
Als nächstes muss die virtuelle Maschine die erforderlichen Einstellungen festlegen, z.
Nach Abschluss der obigen Arbeiten wurde ein neues Objekt aus der Perspektive der virtuellen Maschine generiert. Aus der Sicht des Java -Programms ist die Init -Methode jedoch auch erforderlich, um das Objekt nach den Wünschen des Programmierers zu initialisieren.
Speicherlayout des Objekts
In der virtuellen Hotspot -Maschine kann das Layout der Objekte im Speicher in drei Teile unterteilt werden: Objektkopf, Instanzdaten und Ausrichtungsfüllung.
Der Objektkopf enthält zwei Teile: Der erste Teil wird verwendet, um die Daten des Objekts selbst zu speichern, z. B. den Hash -Code, das GC -Alterungsalter und die von Threads gehaltenen Schlösser. Der Beamte heißt "Markwort". Der zweite Teil ist der Typzeiger, dh der Zeiger des Objekts auf seine Klassenmetaddaten, und die virtuelle Maschine bestimmt, welche Klasse dieses Objekts von diesem Zeiger ist.
Die Instanzdaten sind eine effektive Information, die im Objekt gespeichert ist, und es handelt sich auch um eine Vielzahl von Feldinhalten, die im Programmcode definiert sind.
Die Ausrichtungsfüllung existiert nicht unbedingt, sondern spielt nur die Rolle des Besatzungscharakters. Der Hotpot VM verlangt, dass die Startadresse des Objekts ein ganzzahliges Vielfachen von 8 Bytes sein muss. Ausrichtung.
Objektzugriffspositionierung
Das Java -Programm betreibt das spezifische Objekt im Stapel über die Referenzdaten auf dem Stapel. Die Hauptzugriffsmethoden sind zwei Typen: Handle und Direktzeiger:
Mitarbeiter: Java Heaps zeichnet ein Stück Speicher als Handle -Pool. Wie in der Abbildung gezeigt:
Direktzeiger: Das Layout des Java -Pfahl -Objekts sollte überlegen, wie die relevanten Informationen der Typdaten des Zugriffstyps platziert werden, und die Objektadresse wird in der Referenz gespeichert. Wie in der Abbildung gezeigt:
Die beiden Methoden haben ihre eigenen Vorteile eine Zeitausgaben für die Zeigerpositionierung.
Das obige ist der gesamte Inhalt dieses Artikels.