Maison >Java >javaDidacticiel >Explication détaillée du mécanisme de fonctionnement de la machine virtuelle Java JVM
JVM (Java Virtual Machine) Une spécification pour les appareils informatiques qui peuvent être implémentés de différentes manières (logicielles ou matérielles). Ensuite, cet article vous donnera une brève introduction au mécanisme de fonctionnement de la machine virtuelle Java JVM. Les amis intéressés devraient y jeter un œil ensemble
1 : Concepts de base de JVM
JVM (Java Virtual Machine) Une spécification pour les appareils informatiques qui peut être implémentée de différentes manières (logicielle ou matérielle). La compilation du jeu d'instructions d'une machine virtuelle est très similaire à la compilation du jeu d'instructions d'un microprocesseur. La machine virtuelle Java comprend un ensemble d'instructions de bytecode, un ensemble de registres, une pile, un tas de garbage collection et un champ de méthode de stockage.
La machine virtuelle Java (JVM) est un ordinateur imaginaire capable d'exécuter du code Java. Tant que l'interpréteur est porté sur un ordinateur spécifique conformément à la spécification JVM, tout code Java compilé peut être assuré de s'exécuter sur ce système.
Regardons le schéma d'architecture de Jvm :
2 : Le lien et la différence entre les langages interprétés et les langages compilés .
Le langage compilé utilise un compilateur pour compiler le programme en code machine pouvant être reconnu par la machine cible, tandis que le langage interprété ne nécessite pas de processus de compilation et que le script est lu par le interprète du langage , interprète selon les règles de grammaire, puis appelle les commandes intégrées de l'interpréteur (ou de la bibliothèque fonction ). Par exemple, une fois la fonction printf() du langage C compilée statiquement, tous les codes requis pour printf() sont écrits dans le fichier exécutable sous forme de code machine, et le shell s'exécute Lors de l'exécution d'un programme, recherchez le fichier dans le chemin spécifié , puis le chargeur (Loader) charge le fichier ELF du programme dans la mémoire, passe à l'entrée du programme et le remet contrôle au programme.
La situation avec la compilation dynamique est un peu différente. Puisque printf() est une fonction très couramment utilisée, le système collecte les fonctions communes dans une bibliothèque. Lorsque j'écris une fonction Myprintf() et que j'appelle printf(), le fichier ELF formé après la compilation dynamique ne contient pas. code lié à printf(), mais il y aura des informations indiquant au système : "Mon programme appellera printf(), j'ai donc besoin de l'adresse de printf()." Après avoir chargé le fichier ELF, exécutez d'abord l'éditeur de liens dynamique (ldd). Ldd connaît la bibliothèque dynamique dont dépend le programme. Si la bibliothèque dynamique n'est pas chargée dans le système, il informera le système de charger la bibliothèque et de lier l'entrée. adresse de la fonction de bibliothèque au programme. Si nécessaire, accédez ensuite à l'adresse d'entrée du programme et commencez à exécuter le programme. Ici, une fois le programme que nous écrivons compilé, il devient le code machine d'une machine spécifique et quelques informations auxiliaires (table de symboles, adresse, variable valeur, etc.), puis devient "dynamique" grâce au mécanisme de chargement et de fonctionnement du système. "Procédure" - processus.
Le processus d'exécution des langages interprétés est indissociable de l'interpréteur, python, perl, ruby, etc. Ainsi, la première ligne du script est généralement #/usr/bin/×××. ××× représente l'interprète correspondant pour chaque langue. Les scripts sont généralement composés de expression(expression) et de bloc d'expressions. La première chose que l'interprète doit faire est d'analyser et de comprendre la structure de l'expression pour former une « séquence d'exécution ». Cette « séquence d’exécution » est neutre et ne cible aucune machine native, sa « portabilité » est donc élevée. La raison pour laquelle "bytecode" n'est pas utilisé ici à la place de "séquence d'exécution" est qu'il existe un concept de bytecode dans jvm, et qu'il existe des différences significatives entre eux. La détermination de la séquence d’exécution est le rôle le plus important de l’interprète. Supposons que la fonction générée par python soit python_print(), puis lorsque l'interpréteur python rencontrera cette expression lors de "l'interprétation" du script, il appellera la fonction print() du système pour effectuer l'opération de sortie. Vous pouvez également comprendre le script comme un fichier de configuration de haut niveau. Ce fichier indique à l'interpréteur python comment s'exécuter. Plusieurs règles sur "comment" exécuter ont été formulées dans l'interpréteur.
3 : Processus d'exécution Java
L'exécution JVM des programmes Java est plus compliquée que les deux ci-dessus, car elle est déjà appelée une machine. La figure ci-dessous est le schéma fonctionnel structurel de la JVM. Comprend principalement : le ramasse-miettes, le sous-système de chargement de classe, le moteur d'exécution, la zone de données d'exécution, etc.
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!