Qu'est-ce que la JVM? Présentation de la machine virtuelle Java

La machine virtuelle Java est un programme dont le but est d'exécuter d'autres programmes. C'est une idée simple qui constitue également l'un de nos meilleurs exemples de codage du kung-fu . La JVM a bouleversé le statu quo pour l'époque et continue de soutenir l'innovation de programmation aujourd'hui.

À quoi sert la JVM

La JVM a deux fonctions principales: permettre aux programmes Java de s'exécuter sur n'importe quel périphérique ou système d'exploitation (connu sous le nom de principe «Ecrire une fois, exécuter n'importe où»), et gérer et optimiser la mémoire du programme. Lorsque Java est sorti en 1995, tous les programmes informatiques étaient écrits sur un système d'exploitation spécifique et la mémoire du programme était gérée par le développeur du logiciel. La JVM a donc été une révélation.

JavaWorld /

Avoir une définition technique de la JVM est utile, et les développeurs de logiciels y pensent aussi tous les jours. Décomposons-les:

  • Définition technique : La JVM est la spécification d'un programme logiciel qui exécute le code et fournit l'environnement d'exécution de ce code.
  • Définition de tous les jours : La JVM est la façon dont nous exécutons nos programmes Java. Nous configurons les paramètres de la JVM puis nous nous en remettons à elle pour gérer les ressources du programme pendant l'exécution.

Lorsque les développeurs parlent de JVM, nous entendons généralement le processus exécuté sur une machine, en particulier un serveur, qui représente et contrôle l'utilisation des ressources pour une application Java. Comparez cela à la spécification JVM , qui décrit les conditions requises pour créer un programme qui effectue ces tâches.

Qui développe et gère la JVM?

La JVM est largement déployée, très utilisée et maintenue par des programmeurs très brillants, à la fois d'entreprise et open source. Le projet OpenJDK est le fruit de la décision de Sun Microsystems d'ouvrir Java. OpenJDK a continué à gérer Java par Oracle, une grande partie du gros du travail effectué ces jours-ci par les ingénieurs d'Oracle.

Gestion de la mémoire dans la JVM

L'interaction la plus courante avec une machine virtuelle Java en cours d'exécution consiste à vérifier l'utilisation de la mémoire dans le tas et la pile. Le réglage le plus courant est le réglage des paramètres de mémoire de la JVM.

Collecte des ordures

Avant Java, toute la mémoire du programme était gérée par le programmeur. En Java, la mémoire programme est gérée par la JVM. La machine virtuelle Java gère la mémoire via un processus appelé garbage collection , qui identifie et élimine en permanence la mémoire inutilisée dans les programmes Java. Le garbage collection se produit dans une JVM en cours d'exécution.

Au début, Java a fait l'objet de nombreuses critiques pour ne pas être aussi "proche du métal" que C ++, et donc pas aussi rapide. Le processus de collecte des ordures a été particulièrement controversé. Depuis lors, une variété d'algorithmes et d'approches ont été proposés et utilisés pour le ramasse-miettes. Grâce à un développement et une optimisation cohérents, le garbage collection s'est considérablement amélioré.

Que signifie «proche du métal»?

Quand les programmeurs disent qu'un langage de programmation ou une plate-forme est «proche du métal», nous voulons dire que le développeur est capable de gérer par programmation (en écrivant du code) la mémoire d'un système d'exploitation. En théorie, les programmeurs peuvent extraire plus de performances de nos programmes en stipulant combien est utilisé et quand le rejeter. Dans la plupart des cas, déléguer la gestion de la mémoire à un processus hautement raffiné comme la JVM donne de meilleures performances et moins d'erreurs que de le faire vous-même.

La JVM en trois parties

On pourrait dire que la JVM comporte trois aspects: la spécification, l'implémentation et l'instance. Considérons chacun de ces éléments.

1. La spécification JVM

Premièrement, la JVM est une spécification logicielle. De manière quelque peu circulaire, la spécification JVM souligne que ses détails d'implémentation ne sont pas définis dans la spécification, afin de permettre une créativité maximale dans sa réalisation:

"Pour implémenter correctement la machine virtuelle Java, il vous suffit de pouvoir lire le classformat de fichier et d'exécuter correctement les opérations qui y sont spécifiées."

JS Bach a décrit un jour la création de musique de la même manière:

"Tout ce que vous avez à faire est de toucher la bonne touche au bon moment."

Donc, tout ce que la JVM a à faire est d'exécuter correctement les programmes Java. Cela semble simple, peut même paraître simple de l'extérieur, mais c'est une entreprise énorme, surtout compte tenu de la puissance et de la flexibilité du langage Java.

La JVM en tant que machine virtuelle

La JVM est une machine virtuelle qui exécute les fichiers de classe Java de manière portable. Être une machine virtuelle signifie que la JVM est une abstraction d'une machine réelle sous-jacente, telle que le serveur sur lequel votre programme s'exécute. Quel que soit le système d'exploitation ou le matériel réellement présent, la machine virtuelle Java crée un environnement prévisible pour l'exécution des programmes. Contrairement à une véritable machine virtuelle, cependant, la JVM ne crée pas de système d'exploitation virtuel. Il serait plus précis de décrire la machine virtuelle Java comme un environnement d'exécution géré ou une machine virtuelle de processus .

2. Implémentations JVM

La mise en œuvre de la spécification JVM aboutit à un programme logiciel réel, qui est une implémentation JVM. En fait, il existe de nombreuses implémentations JVM, à la fois open source et propriétaires. La JVM HotSpot d'OpenJDK est l'implémentation de référence et reste l'une des bases de code les plus éprouvées au monde. HotSpot est également la JVM la plus couramment utilisée.

Presque toutes les JVM sous licence sont créées sous forme de fourches à partir d'OpenJDK et de la JVM HotSpot, y compris le JDK sous licence d'Oracle. Les développeurs qui créent un fork sous licence d'OpenJDK sont souvent motivés par le désir d'ajouter des améliorations de performances spécifiques au système d'exploitation. En règle générale, vous téléchargez et installez la machine virtuelle Java en tant que partie intégrée d'un environnement d'exécution Java (JRE).

3. Une instance JVM

Une fois que la spécification JVM a été implémentée et publiée en tant que produit logiciel, vous pouvez la télécharger et l'exécuter en tant que programme. Ce programme téléchargé est une instance (ou une version instanciée) de la JVM.

La plupart du temps, lorsque les développeurs parlent de «JVM», nous faisons référence à une instance JVM s'exécutant dans un environnement de développement ou de production de logiciels. Vous pourriez dire: "Hey Anand, combien de mémoire la JVM utilise-t-elle sur ce serveur?" ou, "Je ne peux pas croire que j'ai créé un appel circulaire et qu'une erreur de dépassement de pile a fait planter ma JVM. Quelle erreur de débutant!"

Qu'est-ce qu'une spécification logicielle?

Une spécification (ou spec) de logiciel est un document de conception lisible par l'homme qui décrit comment un système logiciel doit fonctionner. Le but d'une spécification est de créer une description claire et des exigences auxquelles les ingénieurs doivent coder.

Chargement et exécution de fichiers de classe dans la JVM

Nous avons parlé du rôle de la JVM dans l'exécution des applications Java, mais comment remplit-elle sa fonction? Pour exécuter des applications Java, la JVM dépend du chargeur de classe Java et d'un moteur d'exécution Java.

Le chargeur de classe Java dans la JVM

Tout en Java est une classe et toutes les applications Java sont construites à partir de classes. Une application peut comprendre une classe ou des milliers. Pour exécuter une application Java, une machine virtuelle Java doit charger des fichiers .class compilés dans un contexte, tel qu'un serveur, où ils sont accessibles. Une machine virtuelle Java dépend de son chargeur de classe pour exécuter cette fonction.

Le chargeur de classe Java est la partie de la JVM qui charge les classes en mémoire et les rend disponibles pour exécution. Les chargeurs de classe utilisent des techniques telles que le chargement différé et la mise en cache pour rendre le chargement de classe aussi efficace que possible. Cela dit, le chargement de classe n'est pas le casse-tête épique que (disons) la gestion de la mémoire d'exécution portable, les techniques sont donc relativement simples.

Chaque machine virtuelle Java comprend un chargeur de classe. La spécification JVM décrit des méthodes standard pour interroger et manipuler le chargeur de classe au moment de l'exécution, mais les implémentations JVM sont chargées de remplir ces capacités. Du point de vue du développeur, les mécanismes de chargeur de classe sous-jacents sont généralement une boîte noire.

Le moteur d'exécution dans la JVM

Une fois que le chargeur de classe a terminé son travail de chargement des classes, la JVM commence à exécuter le code dans chaque classe. Le moteur d'exécution est le composant JVM qui gère cette fonction. Le moteur d'exécution est essentiel à la JVM en cours d'exécution. En fait, à toutes fins pratiques, il s'agit de l'instance JVM.

L'exécution du code implique la gestion de l'accès aux ressources système. Le moteur d'exécution JVM se situe entre le programme en cours d'exécution - avec ses demandes de ressources de fichiers, de réseau et de mémoire - et le système d'exploitation, qui fournit ces ressources.

Comment le moteur d'exécution gère les ressources système

Les ressources système peuvent être divisées en deux grandes catégories: la mémoire et tout le reste.

Rappelez-vous que la JVM est responsable de l'élimination de la mémoire inutilisée et que le garbage collection est le mécanisme qui effectue cette élimination. La JVM est également chargée d'allouer et de maintenir la structure référentielle que le développeur tient pour acquise. Par exemple, le moteur d'exécution de la JVM est chargé de prendre quelque chose comme le newmot - clé en Java et de le transformer en une demande d'allocation de mémoire spécifique au système d'exploitation.

Au-delà de la mémoire, le moteur d'exécution gère les ressources pour l'accès au système de fichiers et les E / S réseau. Étant donné que la JVM est interopérable entre les systèmes d'exploitation, ce n'est pas une tâche facile. En plus des besoins en ressources de chaque application, le moteur d'exécution doit être réactif à chaque environnement OS. C'est ainsi que la JVM est capable de gérer les demandes in-the-wild.

Évolution de la JVM: passé, présent, futur

En 1995, la JVM a introduit deux concepts révolutionnaires qui sont depuis devenus la norme pour le développement logiciel moderne: «Ecrire une fois, exécuter n'importe où» et la gestion automatique de la mémoire. L'interopérabilité logicielle était un concept audacieux à l'époque, mais peu de développeurs y réfléchiraient aujourd'hui à deux fois. De même, alors que nos ancêtres en ingénierie devaient gérer eux-mêmes la mémoire des programmes, ma génération a grandi avec le ramassage des ordures.

Nous pourrions dire que James Gosling et Brendan Eich ont inventé la programmation moderne, mais des milliers d'autres ont affiné et développé leurs idées au cours des décennies suivantes. Alors que la machine virtuelle Java était à l'origine réservée à Java, elle a aujourd'hui évolué pour prendre en charge de nombreux langages de script et de programmation, notamment Scala, Groovy et Kotlin. Pour l'avenir, il est difficile de voir un avenir où la JVM ne sera pas une partie importante du paysage du développement.

Tout sur la JVM

  • Challengers Java: comportement des threads dans la JVM
  • Challengers Java: surcharge de méthode dans la JVM
  • Optimisation des performances internes de la JVM
  • Notions de base sur le bytecode: comment la JVM gère le bytecode
  • Exceptions Java: comment la JVM gère les exceptions
  • Présentation de la machine virtuelle Java légère et moyenne

Cette histoire, "Qu'est-ce que la JVM? Présentation de la machine virtuelle Java" a été publiée à l'origine par JavaWorld.