Différence entre JVM, JRE et JDK

Différence entre JVM, JRE et JDK

1. Vue d'ensemble

Dans cet article, nous aborderons les 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 machine virtuelle Java interprète d'abord le bytecode. Il stocke ensuite les informations de classe dans la zone de mémoire. Enfin, il exécute le bytecode généré par le compilateur java.

Il s’agit d’une machine informatique abstraite dotée de son propre jeu d’instructions et manipulant diverses zones de mémoire lors de l’exécution.

Les composants de la machine virtuelle Java sont les suivants:

  • 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 machine virtuelle 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 surclass loaders.

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

The JVM defines various memory areas to execute a Java program. Ceux-ci sont utilisés pendant l'exécution et sont appelés zones de données d'exécution. Certaines de ces zones sont créées au démarrage de la machine virtuelle Java et détruites lors de sa fermeture, tandis que d'autres sont créées lors de la création d'un thread et détruites lors de sa fermeture.

Examinons 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 constant au moment de l’exécution, les données de champ et de méthode, le code des méthodes et des constructeurs, ainsi que des noms de classe entièrement qualifiés. La machine virtuelle Java 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 les matrices de cette zone.

Garbage Collector (GC) récupère la mémoire de tas pour les objets. Fondamentalement, le GC comporte trois phases pour récupérer la mémoire d'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 ayant survécu aux phases mineures de GC.

  • Tenured Space - Cet espace est également appelé espace Old Generation. 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 un espace loué.

JVM crée une zone de mémoire dès son démarrage. Tous les threads de la machine virtuelle Java 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. La machine virtuelle Java 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 s'appelle Stack Frame ou Activation Record. Chaque cadre contient trois parties:

  • Local Variable Array - 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 tableException 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 unité d'exécution de machine virtuelle Java dispose d'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 fonctionnalité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, ils 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 de mémoire. Il comporte trois parties:

Interprète

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

Cependant, la machine virtuelle Java utilise JIT Compiler 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. Par conséquent, il est 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, sa compilation en code machine est planifiée. Cette méthode est alors appelée méthode à chaud. Cette compilation en code machine se produit sur un thread JVM distinct.

De ce fait, il n’interrompt pas l’exécution du programme en cours. Après compilation dans le code machine, il est plus rapide.

Éboueur

Java prend en charge la gestion de la mémoire à l'aide de Garbage Collection. Il s’agit d’examiner la mémoire du tas, d’identifier les objets utilisés et ceux qui ne le sont pas, puis de supprimer les objets inutilisés.

GC est un fil de démon. Il peut être appelé explicitement en utilisant la méthodeSystem.gc _ () _, cependant, il ne sera pas exécuté 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 mettant en œuvre une fonctionnalité dépendante de la plate-forme.

Dans ces cas, nous pouvons utiliser JNI pour permettre au code exécuté dans la machine virtuelle Java d'appeler. Inversement, il permet aux méthodes natives d’appeler le code exécuté dans la machine virtuelle Java.

2.5. Bibliothèques natives

Ce sont des bibliothèques spécifiques à la plate-forme et qui implémentent des 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 de JRE incluent:

  • 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 machine virtuelle Java 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 sousjre/lib/. This path is also known as the bootstrap classpath. Il comprend:

  • Classes d'exécution enrt.jar

  • Classes d'internationalisation eni18n.jar

  • Classes de conversion de caractères encharsets.jar

  • Autres

Bootstrap ClassLoader charge ces classes au démarrage de la machine virtuelle Java.

3.2. Classes d'extension

Nous pouvons trouver des classes d'extension dansjre/lib/extn/ qui agit comme un répertoire pour les extensions de la plate-forme Java. This path is also known as extension classpath.

Il contient des bibliothèques d'exécution JavaFX dansjfxrt.jar et des données de paramètres régionaux pour les packagesjava.text etjava.util danslocaledata.jar. Les utilisateurs peuvent également ajouter des fichiers JAR personnalisés à 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 à l'intérieur de/jre/lib/. Ceux-ci inclus:

  • Configurations de calendrier dans lescalendar.properties

  • Journalisation des configurations enlogging.properties

  • Configurations réseau ennet.properties

  • Propriétés de déploiement en/jre/lib/deploy/

  • Propriétés de gestion en/jre/lib/management/

3.4. Autres fichiers

Outre les fichiers et les classes susmentionnés, JRE contient également des fichiers sur d'autres sujets:

  • Gestion de la sécurité àjre/lib/security

  • Le répertoire pour placer les classes de support pour les applets àjre/lib/applet

  • Fichiers liés aux polices àjre/lib/fonts et autres

4. JDK

Le kit de développement Java (JDK) fournit un environnement et des outils pour le développement, la compilation, le débogage et l'exécution d'un programme Java.

Les composants principaux de JDK comprennent:

  • JRE

  • Outils de développement

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

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

4.1. Outils de base

Ces outils constituent la base du JDK et sont utilisés pour créer et créer des applications Java. Among these tools, we can find utilities for compiling, debugging, archiving, generating Javadocs, etc.

Ils incluent:

  • 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 rechercher 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 Java Archive (JAR) cible 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 fichier 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 la distribution via HTTPS.

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

  • keytool – aide à gérer les entrées de keystore, à savoir, les clés cryptographiques et les certificats

  • jarsigner – génère des fichiers JAR signés numériquement à l'aide des informations du magasin de clés

  • 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 qui communiquent 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 principaux 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 apportenative2ascii.  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 RMI (Remote Method Invocation)

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 exécuté dans une machine virtuelle Java d'appeler des méthodes sur un objet exécuté dans une autre machine virtuelle. Ces outils incluent:

  • rmic – génère des classes de stub, de squelette et de lien pour les 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 – slance 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 – renvoie 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 fonctionnalité 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 IDG (Object Management Group) OMG.

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

RMI-IIOP, c'est-à-dire RMI over IIOP permet la programmation de serveurs CORBA et d'applications via l'API RMI. Cela permet ainsi la connexion entre deux applications écrites dans n’importe quel langage conforme à CORBA via le protocole Internet InterORB Protocol (IIOP).

Ces outils incluent:

  • Service de dénomination transitoire detnameserv – 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 – clients senable pour localiser et 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

These tools help in deploying Java applications and applets on the web. Ils comprennent:

  • pack200 – transforme un fichier JAR en un fichierpack200 à l'aide du compresseur Javagzip

  • unpack200 – transforme le fichierpack200 en fichier JAR

4.7. Outil de plug-in Java

JDK nous fournithtmlconverter. De plus, il est utilisé avec le plug-in Java.

D'une part, Java Plug-in établit une connexion entre les navigateurs les plus répandus et la plate-forme Java. Grâce à cette connexion, les applets du site Web peuvent être exécutées 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 apportejavaws.  Nous pouvons l'utiliser en conjonction avec Java Web Start.

This tool allows us to download and launch Java applications with a single click from the browser. Par conséquent, il n'est pas nécessaire d'exécuter un processus d'installation.

4.9. Outils de surveillance et de gestion

These are great tools that we can use to monitor JVM performance and resource consumption. 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

These are experimental tools that we can leverage for troubleshooting tasks:

  • 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.

Nous avons d’abord décrit la façon dont la machine virtuelle Java est une machine informatique abstraite qui exécute 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 du temps pour explorer les outils et les concepts fondamentaux de ces composants.