Qu’est-ce que la JVM?
La machine virtuelle Java (JVM) est un moteur qui fournit un environnement d’exécution pour piloter le code ou les applications Java. Elle convertit le bytecode Java en langage de machines. La JVM fait partie de l’environnement d’exécution Java (JRE). Dans d’autres langages de programmation, le compilateur produit du code machine pour un système particulier. Cependant, le compilateur Java produit du code pour une machine virtuelle connue sous le nom de machine virtuelle Java.
Voici comment fonctionne la JVM
D’abord, le code Java est compilé en bytecode. Ce bytecode est interprété sur différentes machines
Entre le système hôte et la source Java, le bytecode est un langage intermédiaire.
La JVM de Java est responsable de l’allocation de l’espace mémoire.
Dans ce tutoriel JVM, vous apprendrez-
- Architecture de la JVM
- Compilation du code logiciel & Processus d’exécution
- Processus de compilation et d’exécution du code C
- Processus de compilation et d’exécution du code Java
- Pourquoi Java est-il à la fois un langage interprété et compilé ?
- Pourquoi Java est-il lent ?
Architecture de la JVM
Maintenant dans ce tutoriel sur la JVM, comprenons l’architecture de la JVM. L’architecture de la JVM en Java contient le classloader, la zone mémoire, le moteur d’exécution, etc.
1) ClassLoader
Le class loader est un sous-système utilisé pour charger les fichiers de classe. Il réalise trois fonctions majeures à savoir le chargement, la liaison et l’initialisation.
2) Zone de méthode
La zone de méthode JVM stocke les structures de classe comme les métadonnées, le pool d’exécution constant et le code des méthodes.
3) Heap
Tous les objets, leurs variables d’instance associées et les tableaux sont stockés dans le heap. Cette mémoire est commune et partagée entre plusieurs threads.
4) Piles du langage JVM
Les piles du langage Java stockent les variables locales, et ses résultats partiels. Chaque thread possède sa propre pile JVM, créée simultanément à la création du thread. Une nouvelle trame est créée chaque fois qu’une méthode est invoquée, et elle est supprimée lorsque le processus d’invocation de la méthode est terminé.
5) Registres PC
Le registre PC stocke l’adresse de l’instruction de la machine virtuelle Java qui est en cours d’exécution. En Java, chaque thread possède son propre registre PC.
6) Piles de méthodes natives
Les piles de méthodes natives contiennent l’instruction du code natif dépend de la bibliothèque native. Elle est écrite dans un autre langage au lieu de Java.
7) Moteur d’exécution
C’est un type de logiciel utilisé pour tester du matériel, des logiciels ou des systèmes complets. Le moteur d’exécution des tests ne porte jamais aucune information sur le produit testé.
8) Native Method interface
La Native Method Interface est un cadre de programmation. Elle permet au code Java qui s’exécute dans une JVM d’appeler par des bibliothèques et des applications natives.
9) Bibliothèques de méthodes natives
Les bibliothèques natives sont une collection des bibliothèques natives(C, C++) qui sont nécessaires au moteur d’exécution.
Compilation du code logiciel & Processus d’exécution
Pour écrire et exécuter un programme logiciel, vous avez besoin des éléments suivants
1) Éditeur – Pour taper votre programme dans, un bloc-notes pourrait être utilisé pour cela
2) Compilateur – Pour convertir votre programme en langage évolué en code machine natif
3) Lieur – Pour combiner ensemble différents fichiers de programme référencés dans votre programme principal.
4) Loader – Pour charger les fichiers de votre périphérique de stockage comme le disque dur, le lecteur flash, le CD dans la RAM pour l’exécution. Le chargement se fait automatiquement lorsque vous exécutez votre code.
5) Exécution – Exécution effective du code qui est gérée par votre processeur OS &.
Avec ce contexte, référez-vous à la vidéo suivante & apprendre le fonctionnement interne et l’architecture de la JVM (Java Virtual Machine).
Cliquez ici si la vidéo n’est pas accessible
Processus de compilation et d’exécution du code C
Pour comprendre le processus de compilation en Java. Jetons d’abord un coup d’œil rapide au processus de compilation et de liaison en C.
Supposons que dans le main, vous avez appelé deux fonctions f1 et f2. La fonction principale est stockée dans le fichier a1.c.
La fonction f1 est stockée dans un fichier a2.c
La fonction f2 est stockée dans un fichier a3.c
Tous ces fichiers, à savoir , a1.c, a2.c, et a3.c, est transmis au compilateur. Dont la sortie est les fichiers objets correspondants qui sont le code machine.
L’étape suivante consiste à intégrer tous ces fichiers objets dans un seul fichier .exe à l’aide d’un linker. L’éditeur de liens va masser tous ces fichiers ensemble et produire le fichier .exe.
Pendant l’exécution du programme, un programme de chargement va charger un .exe dans la RAM pour l’exécution.
Compilation et exécution du code Java dans la VM Java
Maintenant dans ce tutoriel JVM, regardons le processus pour JAVA. Dans votre main, vous avez deux méthodes f1 et f2.
- La méthode main est stockée dans le fichier a1.java
- f1 est stockée dans un fichier comme a2.java
- f2 est stockée dans un fichier comme a3.java
Le compilateur va compiler les trois fichiers et produire 3 fichiers .class correspondants qui sont constitués de code BYTE. Contrairement au C, aucune liaison n’est effectuée.
La machine virtuelle Java ou Java Virtual Machine réside dans la mémoire vive. Pendant l’exécution, en utilisant le chargeur de classe, les fichiers de classe sont amenés sur la RAM. Le code BYTE est vérifié pour détecter d’éventuelles failles de sécurité.
Suite, le moteur d’exécution va convertir le Bytecode en code machine natif. C’est la compilation juste à temps. C’est l’une des principales raisons pour lesquelles Java est comparativement lent.
NOTE : Le compilateur JIT ou Just-in-time est la partie de la machine virtuelle Java (JVM). Il interprète une partie du code octet qui a une fonctionnalité similaire en même temps.
Pourquoi Java est à la fois un langage interprété et compilé ?
Les langages de programmation sont classés comme
- Langage de plus haut niveau Ex. C++, Java
- Langues de niveau intermédiaire Ex. C
- Langage de bas niveau Ex Assemblage
- finalement le plus bas niveau comme le langage machine.
Un compilateur est un programme qui convertit un programme d’un niveau de langage à un autre. Exemple de conversion d’un programme C++ en code machine.
Le compilateur java convertit le code java de haut niveau en bytecode (qui est aussi un type de code machine).
Un interpréteur est un programme qui convertit un programme d’un niveau en un autre langage de programmation du même niveau. Exemple de conversion d’un programme Java en C++
En Java, le générateur de code Just In Time convertit le bytecode en code machine natif qui sont aux mêmes niveaux de programmation.
Hence, Java est aussi bien un langage compilé qu’un langage interprété.
Pourquoi Java est-il lent ?
Les deux principales raisons de la lenteur de Java sont
- La liaison dynamique : Contrairement au C, la liaison se fait à l’exécution, à chaque fois que le programme est exécuté en Java.
- Interprète d’exécution : La conversion du code octet en code machine natif se fait à l’exécution en Java, ce qui ralentit encore la vitesse
Cependant, la dernière version de Java a résolu en grande partie les goulots d’étranglement en matière de performances.
Résumé :
- La forme complète de la JVM est la machine virtuelle Java. La JVM dans Java est le moteur qui pilote le code Java. Elle convertit le bytecode Java en langage des machines.
- L’architecture de la JVM en Java contient le chargeur de classe, la zone de mémoire, le moteur d’exécution etc.
- Dans la JVM, le code Java est compilé en bytecode. Ce bytecode est interprété sur différentes machines
- JIT est l’abréviation de Just-in-time compiler. JIT est la partie de la machine virtuelle Java (JVM). Il est utilisé pour accélérer le temps d’exécution
- Par rapport à d’autres machines de compilation, la JVM de Java peut être lente en exécution.