Dieser Artikel bietet Ihnen eine Einführung (Bilder und Texte) über den Stapelrahmen der Java Virtual Machine. Ich hoffe, er wird Ihnen als Referenz dienen Dir hilft.
Vorher geschrieben: Java Virtual Machine ist eine Wissenschaft und ein Meisterwerk vieler Java-Meister. Aufgrund meines begrenzten persönlichen Niveaus und meiner begrenzten Energie kann ich nicht garantieren, dass der Inhalt hier korrekt ist Der Inhalt wird aus dem Originalwerk zitiert, das bereits sehr gut ist, daher werde ich es nicht noch einmal wiederholen. Natürlich ist es unmöglich, hier alle Details eingehend zu analysieren. Da es an einem tiefen Verständnis der Prinzipien der Computerkomposition mangelt, können die meisten davon nur mithilfe der Black-Box-Theorie analysiert werden.
Laufzeit-Stack-Frame-Struktur (Was ist ein Stack-Frame?)
Stack-Frame ist die Datenstruktur, die von der virtuellen Maschine zum Durchführen von Aufrufen und zur Methodenausführung verwendet wird , Stapelrahmen Tatsächlich handelt es sich um das Stapelelement des JVM-Laufzeitdatenbereichs-Stapels der virtuellen Maschine (JVM-Stack). Die Ausführung und der Aufruf jeder Methode entsprechen einem Stapelrahmen. Um ein einfaches Beispiel zu geben: Definieren Sie einen Stack und fügen Sie einige Objekte, sogenannte Stack-Frames, in diesen Statck ein. Dieses Objekt enthält lokale Variablentabelle, Operandenstapel, dynamische Verknüpfung und Methodenrückgabeadresse und andere Attribute. Lassen Sie uns als Nächstes über die Struktur des Stapelrahmenobjekts sprechen.
Zunächst sollten Sie verstehen, dass die Aufrufkette einer Methode in einem Thread sehr lang sein kann und sich viele Methoden im Ausführungsstatus befinden. Für unsere Ausführungs-Engine gibt es nur eine Der Stapelrahmen wird als aktueller Stapelrahmen (Concurrent Satck Frame) bezeichnet. Das entsprechende konzeptionelle Modell ist wie folgt:
Lassen Sie uns anhand des konzeptionellen Modells des Stapelrahmens darüber sprechen, was die relevanten Attribute des Stapelrahmenobjekts sind. Was ist die Datenstruktur?
1. Lokale Variablentabelle
Es handelt sich um einen Speicherplatz für eine Reihe von Variablen, der zum Speichern von Methoden und internen Variablen verwendet wird. Die maximale Kapazitätszuweisung der lokalen Variablentabelle wurde während der Java-Kompilierung abgeschlossen. Um es ganz klar auszudrücken: Die lokale Variablentabelle ist eine Tabelle, die lokale Variablen speichert und deren Kapazität durch den Variablensteckplatz (Variable Slot) bestimmt wird , als Slot bezeichnet), ist Slot auch die kleinste Einheit; relevante Informationen finden Sie in Zhou Zhimings „Ausführliches Verständnis der Java Virtual Machine 2 Edition“ P238 Daten
Wie aus der Abbildung ersichtlich ist, sind die grundlegenden Datentypen außer Double und Long in zwei 32-Bit-Datentypen (d. h. 2 Slots) unterteilt Speicher, also High-Bit-Ausrichtung; während andere Typen nur einen 32-Bit-Slot belegen, kann der
-Referenztyp 32-Bit oder 64-Bit sein, was in Java nicht klar spezifiziert ist . Wie greift die virtuelle Maschine auf lokale Variablen zu?
Die virtuelle Maschine verwendet die lokale Variablentabelle über die Indexpositionierungsmethode. Der Indexwert reicht von 0 bis zur maximalen Anzahl von Slots. Wenn eine Methode ausgeführt wird, insbesondere wenn eine Instanzmethode ausgeführt wird, ist der 0. Index der Instanzvariablentabelle
standardmäßig die Referenz „dieses“ Objektdes Instanzobjekts, zu dem die Methode gehört, gefolgt von 1 bis die Slot-Parametervariable zur Methode Interne lokale Variablen. Um außerdem Platz im Stapelrahmen zu sparen, kann der Slot lokaler Variablen wiederverwendet werden, was bedeutet, dass Methodenparameter + lokale Variablen innerhalb der Methode vorhanden sind! =Maximale Anzahl an Slots. Da Slot wiederverwendet werden kann, spart es nicht nur Platzaufwand, sondern spielt auch eine unerwartete Rolle bei der Speicherbereinigung des Systems. Siehe P2392. Operandenstapel (Operandenstapel)
Der Operandenstapel ist ein Last-In-First-Out-Stack (LIFO). Grundprinzipien und Die Speichermethode ist die gleiche wie bei lokalen Variablen. Die Stapelkapazität für 32-Bit-Datentypen beträgt zu jedem Zeitpunkt der Ausführung der Methode 2 Der Operandenstapel überschreitet nicht den im Datenelement max_statcks festgelegten Wert. Sehen Sie sich P242 an und erstellen Sie unten eine Zusammenfassung
1. Wenn der Stapelrahmen zum ersten Mal erstellt wird, ist der darin enthaltene Operandenstapel leer.
3. Dynamische Verknüpfung
Jeder Stapelrahmen enthält einen Verweis auf die Methode, die dem Stapelrahmen im Laufzeitkonstantenpool zugeordnet ist. Dieser Verweis wird gehalten, um die dynamische Verbindung während des Methodenaufrufs zu unterstützen. Es gibt eine große Anzahl von Symbolreferenzen im Konstantenpool der Klassendatei. Die Methodenaufrufanweisungen im Bytecode verwenden die Symbolreferenzen, die auf die Methoden im Konstantenpool verweisen, als Parameter. Einige dieser symbolischen Referenzen werden während der Klassenladephase oder bei der ersten Verwendung in direkte Referenzen umgewandelt. Diese Konvertierung wird als statische Auflösung bezeichnet. Der andere Teil wird während jeder Laufzeit in eine direkte Referenz umgewandelt. Dieser Teil wird als dynamische Verbindung bezeichnet. 4. Methodenrückgabeadresse Wenn eine Methode ausgeführt wird, gibt es zwei Möglichkeiten, die Methode zu verlassen. Der erste Weg besteht darin, dass die Ausführungs-Engine auf eine von einer beliebigen Methode zurückgegebene Bytecode-Anweisung stößt. Zu diesem Zeitpunkt wird möglicherweise ein Rückgabewert an den oberen Methodenaufrufer übergeben (die Methode, die die aktuelle Methode aufruft, wird als Aufrufer bezeichnet). Rückgabewert? Der Typ des Rückgabewerts wird anhand der gefundenen Methodenrückgabeanweisung bestimmt. Diese Methodenexit-Methode wird als normaler Methodenaufruf-Abschluss bezeichnet. Eine andere Möglichkeit zum Beenden besteht darin, dass während der Methodenausführung eine Ausnahme auftritt und die Ausnahme nicht im Methodenkörper behandelt wird, unabhängig davon, ob es sich um eine innerhalb der Java Virtual Machine generierte Ausnahme oder um eine Ausnahme mit athrow in der handelt Durch Bytecode-Anweisungen generierte Code-Ausnahmen führen dazu, dass die Methode beendet wird, solange kein passender Ausnahmehandler in der Ausnahmetabelle dieser Methode gefunden wird. Diese Exit-Methode wird als Abrupt Method Invocation Completion bezeichnet. Wenn eine Methode über einen Exit zur Ausnahmevervollständigung beendet wird, generiert sie keinen Rückgabewert für ihre Aufrufe. Unabhängig davon, welche Methode zum Beenden verwendet wird, müssen Sie vor dem Beenden der Methode an den Ort zurückkehren, an dem die Methode aufgerufen wurde, damit das Programm weiter ausgeführt werden kann. Wenn die Methode zurückkehrt, müssen Sie dies möglicherweise tun Speichern Sie einige Informationen im Stapelrahmen, um die Wiederherstellung zu erleichtern. Der Ausführungsstatus der übergeordneten Methode. Wenn die Methode normal beendet wird, kann im Allgemeinen der Wert des PC-Zählers des Aufrufers als Rücksprungadresse verwendet werden, und dieser Zählerwert wird wahrscheinlich im Stapelrahmen gespeichert. Wenn eine Methode abnormal beendet wird, muss die Rücksprungadresse vom Ausnahmebehandler ermittelt werden, und dieser Teil der Informationen wird im Allgemeinen nicht im Stapelrahmen gespeichert. Der Prozess des Beendens der Methode entspricht tatsächlich dem Öffnen des aktuellen Stapelrahmens. Daher sind die möglichen Vorgänge beim Beenden: Wiederherstellen der lokalen Variablentabelle und des Operandenstapels der oberen Methode und Zurückgeben des Rückgabewerts (falls (beliebig) wird in den Operandenstapel des aufrufenden Stapelrahmens verschoben und der Wert des PC-Zählers wird aufgerufen, um auf eine Anweisung zu verweisen, die der Methodenaufrufanweisung folgt usw. 5. Zusätzliche Informationen Die Spezifikation der virtuellen Maschine ermöglicht es bestimmten Implementierungen der virtuellen Maschine, dem Stapelrahmen einige Informationen hinzuzufügen, die nicht in der Spezifikation beschrieben sind, z Höhe Verwandte Informationen, dieser Teil der Informationen hängt vollständig von der spezifischen Implementierung der virtuellen Maschine ab. In der tatsächlichen Entwicklung werden dynamische Verbindungen, Methodenrückgabeadressen und andere zusätzliche Informationen im Allgemeinen in einer Kategorie zusammengefasst, die als Stapelrahmeninformationen bezeichnet wird.
Das obige ist der detaillierte Inhalt vonEinführung in Java Virtual Machine Stack Frames (Bilder und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!