Nachdem wir zuvor den JVM-Laufzeitdatenbereich vorgestellt haben, erklären wir weitere Details der Daten im Speicher, um zu sehen, wie sie erstellt, angeordnet und abgerufen werden
1. Objekterstellung
1. Zuweisung von Objekten
Es gibt zwei Hauptmethoden zum Erstellen und Zuweisen von Objekten. Typen: Zeigerkollision und freie Liste
Zeigerkollision:
Unter der Annahme, dass der Heapspeicher absolut regelmäßig ist Wenn Sie Speicherplatz für ein neues Objekt zuweisen, müssen Sie nur den Zeiger in Richtung des freien Speicherplatzes des neuen Objekts bewegen
, um einen Abschnitt mit der erforderlichen Größe zu erhalten.
Im Allgemeinen gilt bei Verwendung eines Kollektors mit einem kompakten (komprimierenden) Prozess eine Zeigerkollision
Freie Liste:
Wenn der Speicher nicht regelmäßig ist, müssen Sie eine Liste führen, um aufzuzeichnen, welcher Speicher frei ist. Suchen Sie bei der Zuweisung von Speicherplatz einen Teil von
aus der Liste und teilen Sie ihn in einen ausreichend großen Speicher auf Platz. Objektinstanzen und Aktualisierungslistendatensätze
Wenn Sie einen Kollektor verwenden, der auf dem Mark-Sweep-Algorithmus basiert, verwenden Sie freie Liste
2. Initialisierung und Einstellung von Objekten
Initialisierung: Nachdem die Speicherzuweisung abgeschlossen ist, wird das Objekt initialisiert und die Die virtuelle Maschine initialisiert den Speicherplatz und alle Werte werden auf 0 initialisiert. Einige notwendige Einstellungen dienen hauptsächlich zum Speichern die Metadateninformationen der Klasse, der Hashwert des Objekts , das Generationsalter usw. im Objektheader.
init
: Nach den beiden oben genannten Schritten wird das Objekt erstellt, aber alle Felder sind immer noch 0. Der letzte Schritt besteht darin, die Init-Methode auszuführen und das Objekt entsprechend der Absicht des Programmierers zu initialisieren Nach Abschluss der oben genannten drei Schritte wird ein Objekt erstellt.
2. Speicherlayout von Objekten
Das Layout von im Speicher gespeicherten Objekten ist hauptsächlich in drei Teile unterteilt. Objekt-Header, Instanzdaten, Ausrichtungsauffüllung Objekt-Header:
Der Objekt-Header wird in der Objekteinstellungsphase erwähnt, das heißt, einige Daten werden im gespeichert Objekt-Header während der Einstellungsphase. Informationen zu Klassenmetadaten, Hash-Wert, Generationsalter usw.
Das Objekt ist hauptsächlich in zwei Teile unterteilt: Laufzeitdaten und Typzeiger
Laufzeitdaten: Es speichert hauptsächlich den Hash-Code, die Generierungsinformationen, die Identifizierung des Sperrstatus, die von Threads gehaltenen Sperren usw., die in der obigen Objekteinstellungsphase gespeichert sind.
Typzeiger
: Ein Zeiger, der hauptsächlich die Klassenmetadaten des Objekts speichert, d. h., von welcher Klasse das Objekt eine Instanz ist. Wenn der Objekttyp außerdem ein Array ist, Objektkopf Es werden auch Daten gespeichert, die die Datenlänge darstellen
Ausrichtungsauffüllung: In Hotspot ist die Startadresse nicht unbedingt vorhanden Das Objekt muss ein Vielfaches von 8 Bytes sein. Wenn der Objektinstanzteil nicht ausgerichtet ist, verwenden Sie Ausrichtungsauffüllung, um ihn zu vervollständigen.
3. Greifen Sie auf die Positionierung von Objekten zu
Java-Programme bedienen Objektinstanzen über Referenzdaten auf dem Stapel, es handelt sich also nur um eine Referenz Die spezifische Positionierungsmethode jvm hat unterschiedliche Implementierungen
Es gibt zwei gängige Implementierungsmethoden: Verwendung von Handles und direkten Zeigern Prinzip: Ein Bereich wird im Java-Heap als Handle-Pool reserviert . Die Referenz speichert die Handle-Adresse
, die den Zeiger der Objektinstanzdaten und den Objekttypzeiger enthältVorteile: Wenn das Objekt verschoben wird, ändern Sie es einfach die im Handle-Pool gespeicherte Adresse Gespeichert wird die Adresse des Objekts
Vorteile: Es spart Zeit bei der Positionierung und ist effizienter
Hotspot verwendet die Direktzeigermethode
Das obige ist der detaillierte Inhalt vonErweiterte JVM-Funktionen-2. JVM-Zuweisung, Layout und Zugriffsprozess von Objekten im Heap. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!