Introduction à la machine virtuelle Java
Dans cet article, nous allons découvrir Java Virtual Machine, alias «JVM». Java Virtual Machine est une machine virtuelle qui permet à un système informatique d'exécuter / exécuter des programmes Java. Fondamentalement, JVM est un moteur qui fonctionne comme un environnement d'exécution pour le code Java. JVM convertit le code java en langage machine. Lorsque vous exécutez un fichier .class compilé, il va à JVM, puis JVM renvoie la sortie. Java Virtual Machine fait partie de JRE, qui signifie «Java Runtime Environment». Les tâches de base d'une machine virtuelle Java consistent à charger le code, puis à vérifier le code et à exécuter le code. Fournissez également l'environnement d'exécution pour l'exécution de code. JVM se compose de divers composants tels que Classloader, la liste de l'espace attribué par JVM comme Stack, un moteur d'exécution et quelques bibliothèques natives.
L'architecture de la machine virtuelle Java 
Comme le montre l'image ci-dessus, l'architecture de machine virtuelle Java se compose de divers composants. Apprenons individuellement sur chaque composant spécifique.
Chargeur
Comme son nom l'indique, c'est un composant responsable du chargement des fichiers de classe. Le chargement, la liaison et l'initialisation d'un fichier de classe sont les principales fonctions du chargeur. Le chargeur fonctionne en runtime.
- Chargement: Fondamentalement, le chargeur lit le fichier .class, puis génère le code binaire et l'enregistre dans une zone de méthode. Bootstrap Classloader, Extension Classloader et Application Classloader sont les différents ClassLoaders chargés de charger différentes classes.
- Liaison: trois fonctions principales comme la vérification, la préparation et la résolution. Cela commence par la vérification du fichier .class. Si la vérification échoue, elle donne une exception de vérification au moment de l'exécution. Plus tard, la mémoire est allouée aux variables avec des valeurs par défaut. Puis, enfin, les références de mémoire symboliques sont remplacées par une référence directe à partir de la zone de mémoire.
- Initialisation: Ceci est une dernière partie de ClassLoader. Les valeurs d'origine sont affectées à toutes les variables statiques, suivies de l'exécution de Static Block. Cette partie s'exécute du haut vers le bas d'une classe.
Tas
Les détails d'un objet et les variables d'instance sont tous stockés ici. Il s'agit d'une zone de mémoire partagée, ce qui signifie que les données stockées ici ne sont pas thread-safe.
Exception dans le thread «principal» java.lang.OutOfMemoryError: espace de tas Java
L'une des erreurs les plus courantes est l'exception «OutOfMemoryError », ce qui signifie que la JVM ne peut pas allouer un objet dans la zone Heap ou que l'allocation de mémoire ne peut pas être effectuée pour le même objet.
Empiler
C'est là qu'une pile d'exécution distincte est créée pour chaque nouveau thread. Également connue sous le nom de pile d'exécution, chaque fois qu'une méthode est appelée, tous les détails sont stockés dans le stand d'exécution correspondant et après l'achèvement de la méthode, ces détails sont supprimés de la pile.
Registres PC
Pour chaque thread unique, un registre PC (compteur de programmes) distinct est créé, qui stocke l'adresse de l'instruction d'exécution en cours, qui sera ultérieurement mise à jour avec l'instruction suivante. Cette zone mémoire est assez petite et de taille fixe.
Pile de méthode native
Il s'agit de son propre type de zone de mémoire, qui est invoquée par un thread, puis le thread est à un tout nouveau niveau où la structure et les restrictions de sécurité impliquées par Java Virtual Machine ne sont plus en exercice. Par rapport aux autres zones de mémoire d'exécution, la mémoire occupée par les piles de méthodes natives n'a pas de taille fixe, sans limitation d'incrémentation ou de décrémentation.
Interface native Java
JNI interagit simplement avec les bibliothèques de méthodes natives mentionnées ci-dessous, qui sont d'implémentation C, C ++, et fournissent la même chose au moteur d'exécution. L'accès direct au code assembleur est autorisé par JNI. Pour une JVM, Java et Native sont les deux types de codes. Le JNI établit en douceur un lien bien défini entre ces deux.
Bibliothèques de méthodes natives
Collection de bibliothèques natives, comme requis par le moteur d'exécution.
Moteur d'exécution
Eh bien, nous avons maintenant un programme java en bytecode, qui est assigné aux zones de données expliquées ci-dessus via un chargeur de classe, et maintenant le bytecode sera exécuté par le moteur d'exécution. Execution Engine lit simplement le bytecode en unités, comme une machine lisant les lignes de code une par une. Le bytecode est un format lisible par l'homme, c'est pourquoi la machine ne peut pas le lire et il doit être converti en un format lisible par machine, où les composants ci-dessous sont utilisés à des fins d'interprétation.
Le moteur d'exécution comporte trois composants principaux, qui sont l'interpréteur, le compilateur JIT et un garbage collector.
1. Interprète
Exécute simplement le bytecode dans une méthode séquentielle. Un appel est effectué par une requête en ligne de commande avec un fichier compilé comme argument. L'interpréteur interprète et exécute les commandes une à une assez rapidement, ce qui se produit plus rapidement que le compilateur JIT pour compiler le code.
nom de classe java
Une classe main () est indispensable dans un fichier .class compilé.
2. Compilateur JIT
L'un des composants les plus importants de l'environnement d'exécution Java, qui améliore les performances de l'application Java au moment de l'exécution. Aucun autre composant n'a plus d'impact sur les performances que le compilateur JIT. Il s'agit d'un compilateur par défaut et il est activé lorsqu'une méthode Java est appelée.
3. Garbage Collector
Comme son nom l'indique, cela a quelque chose à voir avec les déchets, Garbage Collector recherche simplement tous les objets possibles disponibles dans l'espace de tas JVM, vérifie s'il est en cours d'utilisation, puis supprime ceux qui ne sont pas utilisés. Ainsi, il marque simplement les morceaux de mémoire qui sont utilisés ou non. Ensuite, il continue à balayer, où il supprime simplement l'objet marqué. Le meilleur cas d'utilisation est qu'aucun système d'allocation de mémoire manuelle n'est nécessaire, car le garbage collector effectue automatiquement la suppression de l'espace mémoire inutilisé. Mais, comme il s'agit d'une tâche automatique, aucun programmeur n'a le contrôle sur la planification d'un intervalle de temps pour une tâche de nettoyage spécifique et nécessite plus de puissance CPU lors de la recherche de références d'objets.
Conclusion
Bien qu'il ne soit pas obligatoire d'avoir une compréhension claire du fonctionnement de la JVM, dans le but d'écrire du code Java, cela est extrêmement utile. Pour un développeur qui comprend le fonctionnement de la JVM, il écrira du code meilleur et optimisé, aussi long ou complexe soit-il. Outre la description fournie ici, JVM propose un large éventail de fonctionnalités et de technologies. Ces fonctionnalités peuvent être utilisées pour améliorer les performances selon les besoins d'un fournisseur spécifique
Articles recommandés
Ceci est un guide de la machine virtuelle Java. Nous discutons ici de l'architecture de la machine virtuelle java avec ses différents composants. Vous pouvez également consulter les articles suivants pour en savoir plus -
- Tri des bulles en JavaScript
- Cycle de vie des threads en Java
- Qu'est-ce que Java SE?
- Meilleurs compilateurs Java
- JRE vs JVM | 8 principales différences avec (infographie)