Maison Java javaDidacticiel Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur d'exécution de bytecode

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur d'exécution de bytecode

Aug 24, 2019 pm 03:57 PM
jvm

Lorsque le moteur d'exécution de la JVM exécute du code Java, il dispose généralement de deux options : l'exécution interprétée (exécutée via un interpréteur) et l'exécution compilée (code local généré via un compilateur juste à temps pour l'exécution).

Cadre de pile

Définition :

Le cadre de pile est constitué de données utilisées pour prendre en charge l'appel de méthode et l'exécution de méthode par la machine virtuelle Structure située à l’intérieur de la pile de machines virtuelles.

Fonction :

Du début de l'appel jusqu'à la fin de l'exécution, chaque méthode correspond à un cadre de pile qui est poussé dans la pile de la machine virtuelle et ressorti du processus de pile.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Caractéristiques :

(1) Le cadre de pile comprend la table de variables locales, la pile d'opérandes, etc. Quelle est sa taille nécessaire ? La table des variables locales et la profondeur de la pile d'opérandes sont déterminées au moment de la compilation. Parce que la quantité de mémoire qui doit être allouée à un cadre de pile ne sera pas affectée par les données variables pendant l'exécution du programme.

(2) Partage de données entre deux cadres de pile. Dans le modèle conceptuel, les deux cadres de pile sont complètement indépendants, mais dans la mise en œuvre de la machine virtuelle, certains traitements d'optimisation seront effectués pour chevaucher partiellement les deux cadres de pile. De cette façon, une partie des données peut être partagée lors des appels de méthode, sans avoir besoin de copier et de transmettre des paramètres supplémentaires.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

(1) Table de variables locales

La table de variables locales est un ensemble de stockage de valeurs variables espaces Utilisés pour stocker les paramètres de méthode et les variables locales définies dans la méthode.

//方法参数   
max(int a,int b)
Copier après la connexion
rrree

Les variables locales sont différentes des variables de classe (variables modifiées avec statique)

Les variables de classe ont deux processus d'attribution de valeurs initiales : la phase de préparation (attribution de la valeur initiale du système) et la phase d'initialisation (attribution d'une valeur initiale définie par le programmeur). Peu importe donc si aucune valeur n’est attribuée à la variable de classe lors de la phase d’initialisation, elle a toujours une certaine valeur initiale.
Mais les variables locales sont différentes. Si elles sont définies mais sans valeur initiale, elles ne peuvent pas être utilisées.

(2) Pile d'opérations

Lorsqu'une méthode commence juste son exécution, la pile d'opérandes de cette méthode est vide pendant le processus d'exécution, il y aura diverses instructions de bytecode pour écrire et extraire le contenu de la pile d'opérandes, c'est-à-dire des opérations pop et push.

Par exemple, calculez :

int a;//全局变量
void say(){
   int b=0;//局部变量
 }
Copier après la connexion

Les deux éléments les plus proches du sommet de la pile d'opérandes sont 2 et 3. Lorsque l'instruction iadd est exécutée, 2 et 3 seront extraits de la pile et ajouté, puis poussez le résultat ajouté 5 sur la pile.

(3) Lien dynamique

Il existe un grand nombre de références de symboles dans le pool constant du fichier Class et des instructions d'appel de méthode dans le bytecode, prenez simplement une référence symbolique à la méthode dans le pool constant en tant que paramètre. Ces références de symboles sont divisées en deux parties :

Résolution statique : converties en références directes lors de la phase de chargement de la classe ou lors de la première utilisation. Lien dynamique : converti en référence directe à chaque exécution.

(4) Adresse de retour


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

当方法正常退出时

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

当方法异常退出时

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

方法调用

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

(1)解析

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

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

(2)分派

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

Human man=new Man();
Copier après la connexion

在这段代码中,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);  
    }  
}
Copier après la connexion

运行结果是:

I am human
I am human
Copier après la connexion

为什么会产生这个结果呢?
因为编译器在重载时,是通过参数的静态类型而不是实际类型作为判断依据的。在编译阶段,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();
    }  
}
Copier après la connexion

运行结果:

I am man
I am woman 
I am woman
Copier après la connexion

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

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

单分派和多分派:

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

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

字节码解释执行引擎

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

public int calc(){  
    int a = 100;  
    int b = 200;  
    int c = 300;  
    return (a + b) * c;  
}
Copier après la connexion

第一步:将100入栈。

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 2 : Extrayez 100 de la pile d'opérations et stockez-le dans des variables locales. Il en va de même pour les 200 300 suivants.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 3 : Copiez 100 dans la table des variables locales en haut de la pile d'opérandes.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 4 : Copiez 200 dans la table des variables locales en haut de la pile d'opérandes.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 5 : Retirez 100 et 200 de la pile, effectuez une addition entière et enfin repoussez le résultat 300 sur la pile.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 6 : Copiez le troisième nombre 300 de la table des variables locales vers le haut de la pile. L'étape suivante consiste à retirer les deux 300 de la pile, à effectuer une multiplication entière et à placer le résultat final 90 000 sur la pile.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Étape 7 : La méthode se termine et la valeur entière en haut de la pile d'opérandes est renvoyée à l'appelant de cette méthode.

Introduction détaillée à JAVA Virtual Machine (JVM) (6) - moteur dexécution de bytecode

Ce qui précède est une introduction complète à la machine virtuelle JAVA - moteur d'exécution de bytecode. Pour plus de questions connexes, veuillez visiter le site Web PHP chinois : Tutoriel vidéo JAVA<.>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Un outil de supervision JVM distribué, très pratique ! Un outil de supervision JVM distribué, très pratique ! Aug 15, 2023 pm 05:15 PM

Ce projet est conçu pour permettre aux développeurs de surveiller plus rapidement plusieurs JVM hôtes distants. Si votre projet est Spring Boot, il est très facile à intégrer. S'il ne s'agit pas de Spring Boot, ne vous découragez pas. initialiser rapidement un programme de démarrage Spring et le présenter vous-même suffit.

Explication détaillée des paramètres de ligne de commande JVM : l'arme secrète pour contrôler le fonctionnement de la JVM Explication détaillée des paramètres de ligne de commande JVM : l'arme secrète pour contrôler le fonctionnement de la JVM May 09, 2024 pm 01:33 PM

Les paramètres de ligne de commande JVM vous permettent d'ajuster le comportement de la JVM à un niveau plus fin. Les paramètres communs incluent : Définir la taille du tas Java (-Xms, -Xmx) Définir la taille de la nouvelle génération (-Xmn) Activer le garbage collector parallèle (-XX:+UseParallelGC) Réduire l'utilisation de la mémoire de la zone Survivor (-XX : -ReduceSurvivorSetInMemory) Éliminer la redondance Éliminer le garbage collection (-XX:-EliminateRedundantGCs) Imprimer les informations sur le garbage collection (-XX:+PrintGC) Utiliser le garbage collector G1 (-XX:-UseG1GC) Définir le temps de pause maximum du garbage collection (-XX:MaxGCPau

Points clés et précautions relatifs à la gestion de la mémoire JVM Points clés et précautions relatifs à la gestion de la mémoire JVM Feb 20, 2024 am 10:26 AM

Points clés et précautions pour maîtriser l'utilisation de la mémoire de la JVM La JVM (JavaVirtualMachine) est l'environnement dans lequel s'exécutent les applications Java, et le plus important est la gestion de la mémoire de la JVM. Une gestion correcte de la mémoire JVM peut non seulement améliorer les performances des applications, mais également éviter des problèmes tels que des fuites et des débordements de mémoire. Cet article présentera les points et considérations clés de l'utilisation de la mémoire JVM et fournira quelques exemples de code spécifiques. Partitions de mémoire JVM La mémoire JVM est principalement divisée dans les zones suivantes : Heap (Heap)

Analyse des fonctions et principes de la machine virtuelle JVM Analyse des fonctions et principes de la machine virtuelle JVM Feb 22, 2024 pm 01:54 PM

Une introduction à l'analyse des fonctions et des principes de la machine virtuelle JVM : La machine virtuelle JVM (JavaVirtualMachine) est l'un des composants centraux du langage de programmation Java, et c'est l'un des principaux arguments de vente de Java. Le rôle de la JVM est de compiler le code source Java en bytecodes et d'être responsable de l'exécution de ces bytecodes. Cet article présentera le rôle de la JVM et son fonctionnement, et fournira quelques exemples de code pour aider les lecteurs à mieux comprendre. Fonction : La fonction principale de JVM est de résoudre le problème de portabilité des programmes Java sur différentes plateformes.

Erreur Java : erreur de dépassement de mémoire JVM, comment gérer et éviter Erreur Java : erreur de dépassement de mémoire JVM, comment gérer et éviter Jun 24, 2023 pm 02:19 PM

Java est un langage de programmation populaire lors du développement d'applications Java, vous pouvez rencontrer des erreurs de dépassement de mémoire JVM. Cette erreur provoque généralement le crash de l'application, affectant l'expérience utilisateur. Cet article explorera les causes des erreurs de dépassement de mémoire JVM et comment gérer et éviter de telles erreurs. Qu’est-ce qu’une erreur de débordement de mémoire JVM ? La machine virtuelle Java (JVM) est l'environnement d'exécution des applications Java. Dans la JVM, la mémoire est divisée en plusieurs zones, notamment le tas, la zone de méthode, la pile, etc. Le tas est utilisé pour stocker les objets créés

Programme Java pour vérifier si la JVM est 32 bits ou 64 bits Programme Java pour vérifier si la JVM est 32 bits ou 64 bits Sep 05, 2023 pm 06:37 PM

Avant d'écrire un programme Java pour vérifier si la JVM est 32 bits ou 64 bits, parlons d'abord de la JVM. JVM est une machine virtuelle Java, responsable de l'exécution du bytecode. Il fait partie de Java Runtime Environment (JRE). Nous savons tous que Java est indépendant de la plate-forme, mais JVM dépend de la plate-forme. Nous avons besoin d'une JVM distincte pour chaque système d'exploitation. Si nous avons le bytecode de n’importe quel code source Java, nous pouvons facilement l’exécuter sur n’importe quelle plate-forme grâce à JVM. L'ensemble du processus d'exécution du fichier Java est le suivant - Tout d'abord, nous enregistrons le code source Java avec l'extension .java et le compilateur le convertit en bytecode avec l'extension .class. Cela se produit au moment de la compilation. Maintenant, au moment de l'exécution, J

Comment ajuster efficacement la taille de la mémoire tas JVM ? Comment ajuster efficacement la taille de la mémoire tas JVM ? Feb 18, 2024 pm 01:39 PM

Paramètres de mémoire JVM : comment ajuster raisonnablement la taille de la mémoire tas ? Dans les applications Java, la JVM est le composant clé responsable de la gestion de la mémoire. Parmi eux, la mémoire tas est utilisée pour stocker les instances d'objets. Le paramètre de taille de la mémoire tas a un impact important sur les performances et la stabilité de l'application. Cet article explique comment ajuster raisonnablement la taille de la mémoire du tas, avec des exemples de code spécifiques. Tout d’abord, nous devons comprendre quelques connaissances de base sur la mémoire JVM. La mémoire de la JVM est divisée en plusieurs zones, notamment la mémoire tas, la mémoire pile, la zone méthode, etc. dans

Démystifier le principe de fonctionnement de la JVM : exploration approfondie des principes de la machine virtuelle Java Démystifier le principe de fonctionnement de la JVM : exploration approfondie des principes de la machine virtuelle Java Feb 18, 2024 pm 12:28 PM

Explication détaillée des principes JVM : Une exploration approfondie du principe de fonctionnement de la machine virtuelle Java nécessite des exemples de code spécifiques 1. Introduction Avec le développement rapide et l'application généralisée du langage de programmation Java, la machine virtuelle Java (JavaVirtualMachine, appelée JVM ) est également devenu indispensable dans le développement de logiciels. En tant qu'environnement d'exécution des programmes Java, JVM peut fournir des fonctionnalités multiplateformes, permettant aux programmes Java de s'exécuter sur différents systèmes d'exploitation. Dans cet article, nous examinerons le fonctionnement de la JVM

See all articles