Différence entre JVM, JRE et JDK

1. Vue d'ensemble

Dans cet article, nous discuterons des différences entre JVM, JRE et JDK en considérant leurs composants et leurs utilisations.

2. JVM

Java Virtual Machine (JVM) est une implémentation d'une machine virtuelle qui exécute un programme Java.

La JVM interprète d'abord le bytecode. Il stocke ensuite les informations de classe dans la zone mémoire. Enfin, il exécute le bytecode généré par le compilateur java.

C'est une machine informatique abstraite avec son propre jeu d'instructions et manipule diverses zones de mémoire au moment de l'exécution.

Les composants de la JVM sont:

  • Chargeurs de classe
  • Zones de données d'exécution
  • Moteur d'exécution

2.1. Chargeurs de classe

Les tâches initiales de la JVM incluent le chargement, la vérification et la liaison du bytecode. Les chargeurs de classe gèrent ces tâches.

Nous avons un article détaillé spécifiquement sur les chargeurs de classes.

2.2. Zones de données d'exécution

La JVM définit diverses zones de mémoire pour exécuter un programme Java. Celles-ci sont utilisées pendant l'exécution et sont appelées zones de données d'exécution. Certaines de ces zones sont créées au démarrage de la JVM et détruites lorsque la JVM se termine, tandis que d'autres sont créées lors de la création d'un thread et détruites lors de la fermeture d'un thread.

Considérons ces domaines un par un:

Zone de méthode

Fondamentalement, la zone de méthode est analogue à la zone de stockage du code compilé. Il stocke des structures telles que le pool de constantes d'exécution, les données de champ et de méthode, le code des méthodes et des constructeurs ainsi que les noms de classe complets. La JVM stocke ces structures pour chaque classe.

La zone de méthode, également appelée espace de génération permanent (PermGen), est créée au démarrage de la machine virtuelle Java. La mémoire de cette zone n'a pas besoin d'être contiguë. Tous les threads JVM partagent cette zone de mémoire.

Zone de tas

La JVM alloue la mémoire pour toutes les instances de classe et tous les tableaux de cette zone.

Garbage Collector (GC) récupère la mémoire du tas pour les objets. Fondamentalement, GC a trois phases pour récupérer la mémoire des objets à savoir. deux GC mineurs et un GC majeur.

La mémoire de tas comporte trois parties:

  • Eden Space - il fait partie de l'espace Young Generation. Lorsque nous créons un objet, la JVM alloue de la mémoire à partir de cet espace
  • Survivor Space - il fait également partie de l'espace Young Generation. L'espace Survivor contient des objets existants qui ont survécu aux phases GC mineures du GC
  • Tenured Space - Ceci est également connu sous le nom d'espace de l'ancienne génération. Il contient des objets qui ont survécu longtemps. Fondamentalement, un seuil est défini pour les objets de la jeune génération et lorsque ce seuil est atteint, ces objets sont déplacés vers l'espace occupé.

JVM crée une zone de tas dès son démarrage. Tous les threads de la JVM partagent cette zone. La mémoire de la zone de tas n'a pas besoin d'être contiguë.

Zone de pile

Stocke les données sous forme de cadres et chaque cadre stocke les variables locales, les résultats partiels et les appels de méthode imbriqués. JVM crée la zone de pile chaque fois qu'elle crée un nouveau thread. Cette zone est privée pour chaque thread.

Chaque entrée de la pile est appelée Stack Frame ou enregistrement d'activation. Chaque cadre contient trois parties:

  • Tableau de variables locales - contient toutes les variables locales et les paramètres de la méthode
  • Pile d'opérandes - utilisé comme espace de travail pour stocker le résultat du calcul intermédiaire
  • Données de trame - utilisées pour stocker des résultats partiels, renvoyer des valeurs pour les méthodes et faire référence à la table d' exception qui fournit les informations de bloc catch correspondantes en cas d'exceptions

La mémoire de la pile JVM n'a pas besoin d'être contiguë.

Registres PC

Chaque thread JVM possède un registre PC distinct qui stocke l'adresse de l'instruction en cours d'exécution. Si l'instruction en cours d'exécution fait partie de la méthode native, cette valeur n'est pas définie.

Piles de méthodes natives

Les méthodes natives sont celles qui sont écrites dans des langages autres que Java.

JVM fournit des capacités pour appeler ces méthodes natives. Les piles de méthodes natives sont également appelées «piles C». Ils stockent les informations de la méthode native. Chaque fois que les méthodes natives sont compilées dans des codes machine, elles utilisent généralement une pile de méthodes natives pour suivre leur état.

La JVM crée ces piles chaque fois qu'elle crée un nouveau thread. Et donc les threads JVM ne partagent pas cette zone.

2.3. Moteur d'exécution

Le moteur d'exécution exécute les instructions en utilisant les informations présentes dans les zones mémoire. Il comprend trois parties:

Interprète

Une fois que les chargeurs de classe ont chargé et vérifié le bytecode, l'interpréteur exécute le bytecode ligne par ligne. Cette exécution est assez lente. L'inconvénient de l'interpréteur est que lorsqu'une méthode est appelée plusieurs fois, chaque fois qu'une nouvelle interprétation est requise.

Cependant, la JVM utilise le compilateur JIT pour atténuer cet inconvénient.

Compilateur juste à temps (JIT)

Le compilateur JIT compile le bytecode des méthodes souvent appelées en code natif au moment de l'exécution. Il est donc responsable de l'optimisation des programmes Java.

JVM surveille automatiquement les méthodes en cours d'exécution. Une fois qu'une méthode devient éligible pour la compilation JIT, elle est planifiée pour la compilation en code machine. Cette méthode est alors connue sous le nom de méthode à chaud. Cette compilation en code machine se produit sur un thread JVM séparé.

En conséquence, il n'interrompt pas l'exécution du programme en cours. Après compilation en code machine, il s'exécute plus rapidement.

Éboueur

Java prend en charge la gestion de la mémoire à l'aide de Garbage Collection. C'est un processus qui consiste à examiner la mémoire du tas, à identifier les objets utilisés et ceux qui ne le sont pas, et enfin à supprimer les objets inutilisés.

GC est un thread démon. Il peut être appelé explicitement en utilisant System. gc () , cependant, elle ne sera pas exécutée immédiatement et la JVM décide quand appeler GC.

2.4. Interface native Java

Il agit comme une interface entre le code Java et les bibliothèques natives (C / C ++).

Il existe des situations dans lesquelles Java seul ne répond pas aux besoins de votre application, par exemple en implémentant une fonctionnalité dépendante de la plate-forme.

Dans ces cas, nous pouvons utiliser JNI pour activer le code exécuté dans la JVM à appeler. Inversement, il permet aux méthodes natives d'appeler le code s'exécutant dans la JVM.

2.5. Bibliothèques natives

Ce sont des bibliothèques spécifiques à la plate-forme et contiennent l'implémentation de méthodes natives.

3. JRE

Java Runtime Environment (JRE) est un ensemble de composants logiciels utilisés pour exécuter des applications Java.

Les principaux composants du JRE comprennent:

  • Une implémentation d'une machine virtuelle Java (JVM)
  • Classes requises pour exécuter les programmes Java
  • Fichiers de propriété

Nous avons discuté de la JVM dans la section ci-dessus. Ici, nous allons nous concentrer sur les classes principales et les fichiers de support.

3.1. Classes Bootstrap

Nous trouverons des classes bootstrap sous jre / lib / . Ce chemin est également appelé chemin de classe bootstrap. Il comprend:

  • Classes d'exécution dans rt.jar
  • Classes d'internationalisation dans i18n.jar
  • Classes de conversion de caractères dans charsets.jar
  • Autres

Bootstrap ClassLoader charge ces classes au démarrage de la JVM.

3.2. Classes d'extension

Nous pouvons trouver des classes d'extension dans jre / lib / extn / qui agit comme un répertoire pour les extensions de la plate-forme Java. Ce chemin est également appelé chemin d'accès aux classes d'extension.

Il contient des bibliothèques d'exécution JavaFX dans jfxrt.jar et des données locales pour les packages java.text et java.util dans localedata.jar . Les utilisateurs peuvent également ajouter des fichiers JAR personnalisés dans ce répertoire.

3.3. Paramètres de propriété

La plate-forme Java utilise ces paramètres de propriété pour conserver sa configuration. En fonction de leur utilisation, ils se trouvent dans différents dossiers dans / jre / lib / . Ceux-ci inclus:

  • Configurations de calendrier dans le calendrier.properties
  • Journalisation des configurations dans logging.properties
  • Configurations de mise en réseau dans net.properties
  • Propriétés de déploiement dans / jre / lib / deploy /
  • Propriétés de gestion dans / jre / lib / management /

3.4. Autres fichiers

Outre les fichiers et classes mentionnés ci-dessus, JRE contient également des fichiers pour d'autres questions:

  • Gestion de la sécurité chez jre / lib / security
  • Le répertoire pour placer les classes de support pour les applets dans jre / lib / applet
  • Fichiers liés aux polices dans jre / lib / fonts et autres

4. JDK

Le kit de développement Java (JDK) fournit un environnement et des outils pour développer, compiler, déboguer et exécuter un programme Java.

Les principaux composants de JDK comprennent:

  • JRE
  • Outils de développement

Nous avons discuté du JRE dans la section ci-dessus.

Maintenant, nous allons nous concentrer sur divers outils de développement. Classons ces outils en fonction de leur utilisation:

4.1. Outils de base

Ces outils jettent les bases du JDK et sont utilisés pour créer et construire des applications Java. Parmi ces outils, nous pouvons trouver des utilitaires pour la compilation, le débogage, l'archivage, la génération de Javadocs, etc.

Ils comprennent:

  • javac - lit les définitions de classe et d'interface et les compile dans des fichiers de classe
  • java - lance l'application Java
  • javadoc - génère des pages HTML de documentation API à partir de fichiers source Java
  • apt - trouve et exécute les processeurs d'annotations en fonction des annotations présentes dans l'ensemble des fichiers source spécifiés
  • appletviewer - nous permet d'exécuter des applets Java sans navigateur Web
  • jar - regroupe les applets ou applications Java dans une seule archive
  • jdb - un outil de débogage en ligne de commande utilisé pour trouver et corriger les bogues dans les applications Java
  • javah - produit un en-tête C et des fichiers source à partir d'une classe Java
  • javap - désassemble les fichiers de classe et affiche des informations sur les champs, les constructeurs et les méthodes présents dans un fichier de classe
  • extcheck - détecte les conflits de version entre le fichier cible Java Archive (JAR) et les fichiers JAR d'extension actuellement installés

4.2. Outils de sécurité

Il s'agit notamment des outils de gestion des clés et des certificats utilisés pour manipuler les fichiers de clés Java.

Un magasin de clés Java est un conteneur pour les certificats d'autorisation ou les certificats de clé publique. Par conséquent, il est souvent utilisé par les applications basées sur Java pour le chiffrement, l'authentification et le service via HTTPS.

En outre, ils aident à définir les politiques de sécurité sur notre système et à créer des applications qui peuvent fonctionner dans le cadre de ces politiques dans l'environnement de production. Ceux-ci inclus:

  • keytool - aide à gérer les entrées du keystore, à savoir les clés cryptographiques et les certificats
  • jarsigner - génère des fichiers JAR signés numériquement en utilisant les informations du keystore
  • policytool - nous permet de gérer les fichiers de configuration de politique externe qui définissent la politique de sécurité de l'installation

Certains outils de sécurité aident également à gérer les tickets Kerberos.

Kerberos est un protocole d'authentification réseau.

Il fonctionne sur la base de tickets pour permettre aux nœuds communiquant sur un réseau non sécurisé de prouver leur identité les uns aux autres de manière sécurisée:

  • kinit - utilisé pour obtenir et mettre en cache les tickets d'octroi de tickets Kerberos
  • ktab - gère les noms de principe et les paires de clés dans la table de clés
  • klist - affiche les entrées dans le cache des informations d'identification locales et la table des clés

4.3. Outil d'internationalisation

L'internationalisation est le processus de conception d'une application afin qu'elle puisse être adaptée à différentes langues et régions sans modifications techniques.

Pour cela, le JDK apporte native2ascii. Cet outil convertit un fichier avec des caractères pris en charge par JRE en fichiers encodés en échappements ASCII ou Unicode.

4.4. Outils d'invocation de méthode à distance (RMI)

Les outils RMI permettent une communication à distance entre les applications Java, offrant ainsi la possibilité de développer des applications distribuées.

RMI permet à un objet s'exécutant dans une JVM d'appeler des méthodes sur un objet s'exécutant dans une autre JVM. Ces outils comprennent:

  • rmic - génère des classes de stub, de squelette et de lien pour des objets distants à l'aide du protocole Java Remote Method Protocol (JRMP) ou du protocole Internet Inter-Orb (IIOP)
  • rmiregistry - crée et démarre le registre d'objets distant
  • rmid-s lance le démon du système d'activation. Cela permet aux objets d'être enregistrés et activés dans une machine virtuelle Java
  • serialver - retourne l'UID de la version série pour les classes spécifiées

4.5. Outils Java IDL et RMI-IIOP

Le langage de définition d'interface Java (IDL) ajoute la capacité CORBA (Common Object-Based Request Broker Architecture) à la plate-forme Java.

Ces outils permettent aux applications Web Java distribuées d'appeler des opérations sur des services réseau distants à l'aide de la norme de l'industrie Object Management Group (OMG) - IDL.

De même, nous pourrions utiliser le protocole Internet InterORB (IIOP).

RMI-IIOP, c'est-à-dire RMI sur IIOP, permet la programmation des serveurs et applications CORBA via l'API RMI. Permettant ainsi la connexion entre deux applications écrites dans n'importe quel langage compatible CORBA via Internet InterORB Protocol (IIOP).

Ces outils comprennent:

  • tnameserv - service de nommage transitoire qui fournit un répertoire structuré en arborescence pour les références d'objets
  • idlj - le compilateur IDL vers Java pour générer les liaisons Java pour un fichier IDL spécifié
  • orbd - permet aux clients de localiser et d'appeler de manière transparente des objets persistants sur le serveur dans l'environnement CORBA
  • servertool - fournit une interface de ligne de commande pour enregistrer ou désenregistrer un serveur persistant avec ORB Daemon ( orbd ), démarrer et arrêter un serveur persistant enregistré avec ORB Daemon, etc.

4.6. Outils de déploiement Java

Ces outils aident à déployer des applications et des applets Java sur le Web. Ils comprennent:

  • pack200 - transforme un fichier JAR dans un pack200 fichier en utilisant Java de compresseur
  • unpack200 - transforme le fichier pack200 en fichier JAR

4.7. Outil de plug-in Java

JDK nous fournit htmlconverter. De plus, il est utilisé en conjonction avec le plug-in Java.

D'une part, Java Plug-in établit une connexion entre les navigateurs courants et la plate-forme Java. À la suite de cette connexion, les applets du site Web peuvent fonctionner dans un navigateur.

D'autre part, htmlconverter est un utilitaire pour convertir une page HTML contenant des applets en un format pour Java Plug-in.

4.8. Outil de démarrage Web Java

JDK apporte des javaws. Nous pouvons l'utiliser en conjonction avec Java Web Start.

Cet outil nous permet de télécharger et de lancer des applications Java en un seul clic depuis le navigateur. Par conséquent, il n'est pas nécessaire d'exécuter un processus d'installation.

4.9. Outils de surveillance et de gestion

Ce sont d'excellents outils que nous pouvons utiliser pour surveiller les performances de la JVM et la consommation des ressources. En voici quelques-uns::

  • jconsole - fournit une console graphique qui vous permet de surveiller et de gérer les applications Java
  • jps - répertorie les JVM instrumentés sur le système cible
  • jstat - surveille les statistiques JVM
  • jstatd - surveille la création et l'arrêt des JVM instrumentés

4.10. Outils de dépannage

Voici des outils expérimentaux que nous pouvons exploiter pour les tâches de dépannage :

  • info - génère des informations de configuration pour un processus Java spécifié
  • jmap - imprime les mappages de mémoire d'objets partagés ou les détails de la mémoire de tas d'un processus spécifié
  • jsadebugd - s'attache à un processus Java et agit comme un serveur de débogage
  • jstack - imprime les traces de la pile Java des threads Java pour un processus Java donné

5. Conclusion

Dans cet article, nous avons identifié que la différence fondamentale entre JVM, JRE et JDK réside dans leur utilisation.

Tout d'abord, nous avons décrit comment la JVM est une machine informatique abstraite qui exécute réellement le bytecode Java.

Ensuite, nous avons expliqué comment exécuter simplement des applications Java, nous utilisons le JRE.

Et enfin, nous avons compris comment développer des applications Java, nous utilisons le JDK.

Nous avons également pris un certain temps pour approfondir les outils et les concepts fondamentaux de ces composants.