Heim Java javaLernprogramm Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Aug 24, 2019 pm 03:57 PM
jvm

Wenn die Ausführungs-Engine in der JVM Java-Code ausführt, stehen ihr im Allgemeinen zwei Optionen zur Verfügung: interpretierte Ausführung (Ausführung durch einen Interpreter) und kompilierte Ausführung (lokale Code-Ausführung, die durch einen Just-in-Time-Compiler generiert wird).

Stack-Frame

Definition:

Stack-Frame sind Daten, die zur Unterstützung des Methodenaufrufs und der Methodenausführung durch die virtuelle Maschine verwendet werden Struktur, die sich innerhalb des Stapels der virtuellen Maschine befindet.

Funktion:

Vom Beginn des Aufrufs bis zum Abschluss der Ausführung entspricht jede Methode einem Stapelrahmen, der in den Stapel der virtuellen Maschine geschoben und herausgesprungen wird des Stapelprozesses.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Funktionen:

(1) Der Stapelrahmen enthält die lokale Variablentabelle, den Operandenstapel usw. Wie groß ist er? benötigt? Die lokale Variablentabelle und die Tiefe des Operandenstapels werden zur Kompilierzeit bestimmt. Denn wie viel Speicher einem Stapelrahmen zugewiesen werden muss, wird während der Programmlaufzeit nicht durch variable Daten beeinflusst.

(2) Datenaustausch zwischen zwei Stapelrahmen. Im konzeptionellen Modell sind die beiden Stapelrahmen völlig unabhängig, aber bei der Implementierung der virtuellen Maschine wird eine gewisse Optimierungsverarbeitung durchgeführt, um die beiden Stapelrahmen teilweise zu überlappen. Auf diese Weise kann ein Teil der Daten bei Methodenaufrufen gemeinsam genutzt werden, ohne dass zusätzliches Kopieren und Übergeben von Parametern erforderlich ist.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

(1) Lokale Variablentabelle

Die lokale Variablentabelle ist eine Reihe von Variablenwertspeichern Leerzeichen werden zum Speichern von Methodenparametern und lokalen Variablen verwendet, die innerhalb der Methode definiert sind.

//方法参数   
max(int a,int b)
Nach dem Login kopieren
rrree

Lokale Variablen unterscheiden sich von Klassenvariablen (mit statischen Variablen modifizierte Variablen)

Klassenvariablen haben zwei Prozesse zum Zuweisen von Anfangswerten: die Vorbereitungsphase (Zuweisung des Systemanfangswerts) und die Initialisierungsphase (Zuweisung eines vom Programmierer definierten Anfangswerts). Es spielt also keine Rolle, wenn der Klassenvariablen während der Initialisierungsphase kein Wert zugewiesen wird, sie hat immer noch einen bestimmten Anfangswert.
Lokale Variablen sind jedoch anders. Wenn sie definiert sind, aber kein Anfangswert zugewiesen ist, können sie nicht verwendet werden.

(2) Operationsstapel

Wenn eine Methode gerade mit der Ausführung beginnt, ist der Operandenstapel dieser Methode während des Ausführungsprozesses leer. Es gibt verschiedene Bytecode-Anweisungen zum Schreiben und Extrahieren von Inhalten aus dem Operandenstapel, dh Pop- und Push-Operationen.

Berechnen Sie beispielsweise:

int a;//全局变量
void say(){
   int b=0;//局部变量
 }
Nach dem Login kopieren

Die beiden Elemente, die sich am nächsten an der Spitze des Operandenstapels befinden, sind 2 und 3. Wenn die iadd-Anweisung ausgeführt wird, werden 2 und 3 vom Stapel entfernt und addiert, und dann das addierte Ergebnis 5 auf den Stapel schieben.

(3) Dynamischer Link

Der Konstantenpool der Klassendatei enthält eine große Anzahl von Symbolreferenzen und Anweisungen zum Methodenaufruf Nehmen Sie im Bytecode einfach einen symbolischen Verweis auf die Methode im Konstantenpool als Parameter. Diese Symbolreferenzen sind in zwei Teile unterteilt:

Statische Auflösung: Während der Klassenladephase oder bei der ersten Verwendung in direkte Referenzen umgewandelt. Dynamischer Link: bei jedem Lauf in eine direkte Referenz umgewandelt.

(4) Rücksendeadresse


当一个方法开始执行后,只有两种方式可以退出这个方法:正常退出、异常退出。无论采用何种退出方式,在方法退出之后,都需要返回到方法被调用的位置,程序才能继续执行。

当方法正常退出时

调用者的PC计数器作为返回地址。栈帧中一般会保存这个计数器值。

当方法异常退出时

返回地址是要通过异常处理器表来确定的。栈帧中一般不会保存这部分信息。

方法调用

方法调用是确定调用哪一个方法。

(1)解析

对“编译器可知,运行期不可变”的方法进行调用称为解析。符合这种要求的方法主要包括

静态方法,用static修饰的方法私有方法,用private修饰的方法

(2)分派

分派讲解了虚拟机如何确定正确的目标方法。分派分为静态分派和动态分派。讲解静动态分派之前,我们先看个多态的例子。

Human man=new Man();
Nach dem Login kopieren

在这段代码中,Human为静态类型,其在编译期是可知的。Man是实际类型,结果在运行期才可确定,编译期在编译程序的时候并不知道一个对象的实际类型是什么。

静态分派:

所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。它的典型应用是重载。

public class StaticDispatch{  
   static abstract class Human{  
    }  
   static class Man extends Human{
    }
    static class Woman extends Human{
    }
    public void say(Human hum){  
        System.out.println("I am human");  
    }  
    public void say(Man hum){  
        System.out.println("I am man");  
    }  
    public void say(Woman hum){  
        System.out.println("I am woman");  
    }  
    
    public static void main(String[] args){  
        Human man = new Man();  
        Human woman = new Woman();  
        StaticDispatch sr = new StaticDispatch();  
        sr.say(man);  
        sr.say(woman);  
    }  
}
Nach dem Login kopieren

运行结果是:

I am human
I am human
Nach dem Login kopieren

为什么会产生这个结果呢?
因为编译器在重载时,是通过参数的静态类型而不是实际类型作为判断依据的。在编译阶段,javac编译器会根据参数的静态类型决定使用哪个重载版本,所以两个对say()方法的调用实际为sr.say(Human)。

动态分派:

在运行期根据实际类型确定方法执行版本的分派过程。它的典型应用是重写。

public class DynamicDispatch{  
   static abstract class Human{  
            protected abstract void say();
    }  
   static class Man extends Human{
            @Override
             protected abstract void say(){
             System.out.println("I am man");  
            }
    }
    static class Woman extends Human{
         @Override
             protected abstract void say(){
             System.out.println("I am woman ");  
            }
    }
    
    public static void main(String[] args){  
        Human man = new Man();  
        Human woman = new Woman();  
        man.say();
        woman.say();
        man=new Woman();
        man.say();
    }  
}
Nach dem Login kopieren

运行结果:

I am man
I am woman 
I am woman
Nach dem Login kopieren

这似乎才是我们平时敲的java代码。对于方法重写,在运行时才确定调用哪个方法。由于Human的实际类型是man,因此调用的是man的name方法。其余的同理。

动态分派的实现依赖于方法区中的虚方法表,它里面存放着各个方法的实际入口地址。如果某个方法在子类中被重写了,那子类方法表中的地址将会替换为指向子类实现版本的入口地址,否则,指向父类的实现入口。

单分派和多分派:

方法的接收者与方法的参数统称为方法的宗量,根据分派基于多少种宗量,分为单分派和多分派。

在静态分派中,需要调用者的实际类型和方法参数的类型才能确定方法版本,所以其是多分派类型。在动态分派中,已经知道了参数的实际类型,所以此时只需知道方法调用者的实际类型就可以确定出方法版本,所以其是单分派类型。综上,java是一门静态多分派,动态单分派的语言。

字节码解释执行引擎

虚拟机中的字节码解释执行引擎是基于栈的。下面通过一段代码来仔细看一下其解释的执行过程。

public int calc(){  
    int a = 100;  
    int b = 200;  
    int c = 300;  
    return (a + b) * c;  
}
Nach dem Login kopieren

第一步:将100入栈。

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 2: Nehmen Sie 100 aus dem Operationsstapel und speichern Sie es in lokalen Variablen. Das Gleiche gilt für die folgenden 200.300.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 3: Kopieren Sie 100 in der lokalen Variablentabelle an die Spitze des Operandenstapels.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 4: Kopieren Sie 200 in der lokalen Variablentabelle an die Spitze des Operandenstapels.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 5: Nehmen Sie 100 und 200 vom Stapel, führen Sie eine Ganzzahladdition durch und schieben Sie schließlich das Ergebnis 300 zurück auf den Stapel.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 6: Kopieren Sie die dritte Zahl 300 aus der lokalen Variablentabelle an die Spitze des Stapels. Der nächste Schritt besteht darin, die beiden 300er vom Stapel zu nehmen, eine Ganzzahlmultiplikation durchzuführen und das Endergebnis 90000 auf den Stapel zu legen.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Schritt 7: Die Methode endet und der ganzzahlige Wert oben im Operandenstapel wird an den Aufrufer dieser Methode zurückgegeben.

Detaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine

Das Obige ist eine vollständige Einführung in die JAVA Virtual Machine – Bytecode-Ausführungs-Engine. Weitere verwandte Fragen finden Sie auf der chinesischen PHP-Website: JAVA Video Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in JAVA Virtual Machine (JVM) (6) – Bytecode-Ausführungs-Engine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ein verteiltes JVM-Überwachungstool, sehr praktisch! Ein verteiltes JVM-Überwachungstool, sehr praktisch! Aug 15, 2023 pm 05:15 PM

Dieses Projekt soll es Entwicklern erleichtern, mehrere Remote-Host-JVMs zu überwachen. Wenn es sich bei Ihrem Projekt um Spring Boot handelt, ist die Integration einfach. Lassen Sie sich nicht entmutigen Es reicht aus, schnell ein Spring-Boot-Programm zu initialisieren und es selbst einzuführen

Detaillierte Erläuterung der JVM-Befehlszeilenparameter: die Geheimwaffe zur Steuerung des JVM-Betriebs Detaillierte Erläuterung der JVM-Befehlszeilenparameter: die Geheimwaffe zur Steuerung des JVM-Betriebs May 09, 2024 pm 01:33 PM

Mit JVM-Befehlszeilenparametern können Sie das JVM-Verhalten auf einer feinkörnigen Ebene anpassen. Zu den allgemeinen Parametern gehören: Festlegen der Java-Heap-Größe (-Xms, -Xmx), Festlegen der Größe der neuen Generation (-Xmn), Aktivieren des parallelen Garbage Collectors (-XX:+UseParallelGC), Reduzieren der Speichernutzung des Survivor-Bereichs (-XX: -ReduceSurvivorSetInMemory) Redundanz eliminieren Garbage Collection eliminieren (-XX:-EliminateRedundantGCs) Informationen zur Garbage Collection drucken (-XX:+PrintGC) Den G1 Garbage Collector verwenden (-XX:-UseG1GC) Die maximale Pausenzeit für die Garbage Collection festlegen (-XX:MaxGCPau

Wichtige Punkte und Vorsichtsmaßnahmen für die JVM-Speicherverwaltung Wichtige Punkte und Vorsichtsmaßnahmen für die JVM-Speicherverwaltung Feb 20, 2024 am 10:26 AM

Wichtige Punkte und Vorsichtsmaßnahmen für die Beherrschung der JVM-Speichernutzung JVM (JavaVirtualMachine) ist die Umgebung, in der Java-Anwendungen ausgeführt werden, und die wichtigste davon ist die Speicherverwaltung der JVM. Durch die ordnungsgemäße Verwaltung des JVM-Speichers kann nicht nur die Anwendungsleistung verbessert, sondern auch Probleme wie Speicherlecks und Speicherüberläufe vermieden werden. In diesem Artikel werden die wichtigsten Punkte und Überlegungen zur JVM-Speichernutzung vorgestellt und einige spezifische Codebeispiele bereitgestellt. JVM-Speicherpartitionen Der JVM-Speicher ist hauptsächlich in die folgenden Bereiche unterteilt: Heap (He

Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine Feb 22, 2024 pm 01:54 PM

Eine Einführung in die Analyse der Funktionen und Prinzipien der virtuellen JVM-Maschine: Die virtuelle JVM-Maschine (JavaVirtualMachine) ist eine der Kernkomponenten der Programmiersprache Java und eines der größten Verkaufsargumente von Java. Die Rolle der JVM besteht darin, Java-Quellcode in Bytecodes zu kompilieren und für die Ausführung dieser Bytecodes verantwortlich zu sein. In diesem Artikel werden die Rolle von JVM und ihre Funktionsweise vorgestellt und einige Codebeispiele bereitgestellt, um den Lesern das Verständnis zu erleichtern. Funktion: Die Hauptfunktion von JVM besteht darin, das Problem der Portabilität von Java-Programmen auf verschiedenen Plattformen zu lösen.

Java-Fehler: JVM-Speicherüberlauffehler, wie man damit umgeht und ihn vermeidet Java-Fehler: JVM-Speicherüberlauffehler, wie man damit umgeht und ihn vermeidet Jun 24, 2023 pm 02:19 PM

Java ist eine beliebte Programmiersprache. Bei der Entwicklung von Java-Anwendungen können JVM-Speicherüberlauffehler auftreten. Dieser Fehler führt normalerweise zum Absturz der Anwendung und beeinträchtigt das Benutzererlebnis. In diesem Artikel werden die Ursachen von JVM-Speicherüberlauffehlern und der Umgang mit solchen Fehlern sowie deren Vermeidung untersucht. Was ist ein JVM-Speicherüberlauffehler? Die Java Virtual Machine (JVM) ist die Ausführungsumgebung für Java-Anwendungen. In der JVM ist der Speicher in mehrere Bereiche unterteilt, einschließlich Heap, Methodenbereich, Stapel usw. Der Heap wird zum Speichern erstellter Objekte verwendet

Java-Programm zum Überprüfen, ob JVM 32-Bit oder 64-Bit ist Java-Programm zum Überprüfen, ob JVM 32-Bit oder 64-Bit ist Sep 05, 2023 pm 06:37 PM

Bevor wir ein Java-Programm schreiben, um zu überprüfen, ob die JVM 32-Bit oder 64-Bit ist, wollen wir zunächst die JVM besprechen. JVM ist eine virtuelle Java-Maschine, die für die Ausführung von Bytecode verantwortlich ist. Es ist Teil der Java Runtime Environment (JRE). Wir alle wissen, dass Java plattformunabhängig ist, JVM jedoch plattformabhängig. Wir benötigen für jedes Betriebssystem eine separate JVM. Wenn wir den Bytecode eines beliebigen Java-Quellcodes haben, können wir ihn dank JVM problemlos auf jeder Plattform ausführen. Der gesamte Prozess der Java-Dateiausführung läuft wie folgt ab: Zuerst speichern wir den Java-Quellcode mit der Erweiterung .java und der Compiler konvertiert ihn in Bytecode mit der Erweiterung .class. Dies geschieht zur Kompilierungszeit. Jetzt, zur Laufzeit, J

Wie kann die Größe des JVM-Heapspeichers effizient angepasst werden? Wie kann die Größe des JVM-Heapspeichers effizient angepasst werden? Feb 18, 2024 pm 01:39 PM

JVM-Speicherparametereinstellungen: Wie kann die Heap-Speichergröße angemessen angepasst werden? In Java-Anwendungen ist die JVM die Schlüsselkomponente, die für die Speicherverwaltung verantwortlich ist. Unter anderem wird der Heap-Speicher zum Speichern von Objektinstanzen verwendet. Die Größeneinstellung des Heap-Speichers hat einen wichtigen Einfluss auf die Leistung und Stabilität der Anwendung. In diesem Artikel wird anhand spezifischer Codebeispiele erläutert, wie die Größe des Heap-Speichers sinnvoll angepasst werden kann. Zunächst müssen wir uns einige Grundkenntnisse über JVM-Speicher aneignen. Der Speicher der JVM ist in mehrere Bereiche unterteilt, darunter Heap-Speicher, Stapelspeicher, Methodenbereich usw. In

Entmystifizierung des Funktionsprinzips von JVM: Eingehende Untersuchung der Prinzipien der Java Virtual Machine Entmystifizierung des Funktionsprinzips von JVM: Eingehende Untersuchung der Prinzipien der Java Virtual Machine Feb 18, 2024 pm 12:28 PM

Ausführliche Erläuterung der JVM-Prinzipien: Für eine eingehende Untersuchung des Funktionsprinzips der Java Virtual Machine sind spezifische Codebeispiele erforderlich ) ist auch in der Softwareentwicklung nicht mehr wegzudenken. Als Ausführungsumgebung für Java-Programme kann JVM plattformübergreifende Funktionen bereitstellen, sodass Java-Programme auf verschiedenen Betriebssystemen ausgeführt werden können. In diesem Artikel werden wir uns mit der Funktionsweise der JVM befassen

See all articles