Aide En Informatique
Latest Posts:

La Plateforme Java Sous Le Capot : Allons à sa dècouverte
La Plateforme Java Sous Le Capot : Allons à sa dècouverte

 La plateforme Java est constituée de 3 parties:

  • La JVM (Java Virtual Machine)
  • La Java SE (Standard Edition) Runtime Environment (JRE)
  • La  Java SE Development Kit (JDK)
LA JDK
Le JDK est un environnement de développement logiciel qui fournit les outils et les bibliothèques nécessaires pour développer et analyser des applications Java. Le JDK fournit une collection de bibliothèques, de fonctions et de programmes de base nécessaires pour compiler le code écrit en bytecode. Le JDK contient le JRE (environnement d'exécution) requis pour exécuter l'application. Le JDK fournit également des outils très utiles, tels que les applications suivantes :
 
  1. jlink : pour la génération d' un JRE personnalisé
  2. jshell : il s'agit d'un outil pratique de lecture-évaluation-impression-boucle ( ce qu'on appelle une REPL Read-Evaluate-Print-Loop) pour essayé l'execution ligne par ligne du code en langage Java
  3. jcmd : il s'agit d'un utilitaire permettant d'envoyer une commande de diagnostic à la JVM active
  4. javac : il s'agit du compilateur Java, qui lit un fichier d'entrée avec le suffixe .java et produit un fichier de classe Java avec le suffixe .class
  5. java: qui execute la  JRE
 
LA JRE
Le JRE fait partie du JDK ou peut être distribué en tant que programme autonome pour le système d'exploitation cible. Pour exécuter un fichier avec une extension .class ou un fichier Java Archive (JAR), le système cible doit contenir la version appropriée du JRE. Contrairement au JDK, le JRE ne contient qu'une collection minimale de composants nécessaires à l'exécution du programme, tels que les suivants :
 
Bibliothèques principales et fichiers de propriétés : par exemple, rt.jar et charset.jar
Fichiers d'extension Java : bibliothèques supplémentaires pouvant résider dans le dossier lib
Fichiers liés à la sécurité : certificats, stratégies, etc.
Fichiers de polices
Outils spécifiques au système d'exploitation
Le JRE comprend une JVM et précisément deux types de compilateurs :
 
Compilateur client : chargement rapide sans optimisation. Il est conçu pour exécuter les instructions pour obtenir un résultat très rapidement. Couramment utilisé pour les programmes autonomes.
Compilateur de serveur : le code chargé passe par des vérifications supplémentaires pour assurer la stabilité du code. Il y a aussi un effort pour produire un code machine hautement optimisé dans l'optique d'obtenir des meilleures performances. Il prend en charge de meilleures statistiques afin d'optimiser le  code machine exécutée par le compilateur juste-à-temps (JIT).
 
LA JVM
 
 
Le JDK et le JRE contiennent tous deux la JVM . La JVM dépend de la plate-forme. Cela signifie que chaque plate-forme  nécessite l'utilisation d'une version dédiée par  plateforme nous entendons par la non seulement le systhème d'exploitation mais aussi l'architecture du processeur ou est executé le code java. Bien, mais que fait vraiment la JVM, et comment ?
 
Bien qu'il existe plusieurs versions de la JVM, même de plusieurs fournisseurs, la JVM elle-même est définie par une spécification qui doit être suivie. L'implémentation de référence est représentée par OpenJDK. En fait, OpenJDK est une collection de plusieurs projets open source plus petits qui peuvent même avoir des dynamiques de développement différentes, mais la version OpenJDK contient des versions prévues de chacun.
 
L'implémentation OpenJDK JVM  inclut un compilateur JIT appelé HotSpot. HotSpot fait partie de la JVM et sa responsabilité est la compilation d'exécution. En d'autres termes, le compilateur JIT traduit ou compile le bytecode fourni en code native (code machine ou instruction machine propre à l'architecture) au moment de l'exécution. Ce processus est parfois appelé compilation  dynamique d'ou le nom JIT en anglais qui veut dire Just In Time Compilation. En raison des capacité de compilation dynamique de la  JVM, les applications Java sont parfois qualifiées de plateform independent en anglais comme pour dire que els applications sont indépendant des plateformes ou mieux ne sont pas specifiques à une plateforme precise ou encore mieux sont multiplateforme  d'ou le plus souvent on parle de WORA  (Write Once, Run everyWhere = ecrit une fois et execute partout en traduction mot à mot de l'anglais)est utilisé.
 
En plus du compilateur JIT, La JVM  comprend un ramasse-miettes (Garbage Collector) avec divers algorithmes, un chargeur de classe (ClassLoader), un modèle d'implémentation de mémoire Java et une interface native Java (JNI) avec des bibliothèques.
 
Chaque fournisseur de JVM doit suivre les spécifications OpenJDK. Cela garantit que le bytecode sera non seulement créé en conséquence mais également exécuté et correctement converti en instructions machine. Cela signifie que différents fournisseurs peuvent fournir différentes implémentations JVM avec des métriques ou des optimisations légèrement différentes, telles que la dynamicité du ramasse-miettes. Ces fournisseurs incluent IBM, Azul, Oracle, etc. La diversité des fournisseurs peut être considérée comme l'un des principaux facteurs déterminants de l'évolution de la plate-forme Java. Les nouvelles fonctionnalités sont étendues ou modifiées par la JDK Enhancement Proposal (JEP), où chaque fournisseur peut contribuer ou obtenir un aperçu très détaillé.
 
Pour résumer, les responsabilités de la JVM à retenir sont les suivantes :
 
Chargement des liens
Initiation des classes et des interfaces
Exécution des instructions du programme
La JVM définit plusieurs zones différentes utilisées par chaque programme. Examinons chacun d'eux un par un, domaine par domaine . Cela va nous éclaicir et mieux nous faire comprendre comment écrire du bon code java.
 
 
Tout commence par un texte écrit, représentant un programme stocké dans un fichier .java. Le fichier sera compilé  et exécuté  et les threads seront lancés. L'OS démarre le processus système dans lequel le JRE s'exécute et la JVM s'exécute dans le cadre du JRE.
Avec une idée générale du flux, commençons par charger les classes en mémoire.
 
La zone dedié au chargeur de classe(class-loader loader)
Le sous-système class-loader est situé dans la mémoire vive (RAM) et est responsable du chargement des classes dans la mémoire. L'étape de chargement se compose des étapes de sous-ligne et de la première exécution de la classe au moment de l'exécution. Le linking est le processus de préparation d'une classe ou d'une interface pour un environnement d'exécution, qui peut inclure des dépendances internes, par exemple. La plateforme propose des fonctionnalités internes ou personnalisées ; pour gérer toutes ces fonctionnalités, la plateforme fournit des chargeurs de classes dédiés :
 
Bootstrap class loader : responsable du chargement des classes de plate-forme par défaut. Il est fourni par JVM et charge les classes à partir du BOOTPATH ​​(propriété).
Extension class loader : charge les bibliothèques supplémentaires à partir du répertoire lib/ext, qui fait partie de l'installation de JRE.
 
System class loader (Chargeur de classe système) : ce sous système c'est le chargeur de la classe d'application par défaut qui fait référence à la méthode principale (main) et exécute les classes à partir des classes correspondantes ou du chemin des modules.
User-defined class loaders (Chargeurs de classes définis par l'utilisateur) : il s'agit d'instances de  ClassLoader et peuvent être utilisées pour définir des classes personnalisées chargeant dynamiquement des processus sur la JVM. Il est possible d'utiliser une destination de classe définie par l'utilisateur. Les classes peuvent résider sur le réseau, être chiffrées dans des fichiers ou être téléchargées sur le réseau et générées à la volée (runtime).
Les chargeurs de classe ou class loader,  fonctionnent en séquence. La séquence est représentée par une hiérarchie. Cela signifie que chaque enfant doit se référer à ses parents. Ceci définit automatiquement l'ordre de recherche des classes binaires.
 
Lorsqu'une classe est présente dans la RAM, la plate-forme Java prend des mesures pour rendre la classe disponible pour l'environnement d'exécution. La plate-forme Java exécute plusieurs processus en arrière-plan pour déplacer les données de classe pertinentes vers d'autres zones, telles que la pile(Stack), le tas(Heap), etc. Regardons ensuite la zone de pile.
 

 La Pile(stack area)

La zone de pile est réservée pour chaque thread au moment de l'exécution. Il s'agit d'une petite zone de stockage des références au méthode. Lorsqu'un thread exécute une méthode, une entrée pour cette méthode est créée et déplacée vers le haut de la pile. Ce type d'élément est appelé un stack frame, qui a une référence à un champ de variables locales, une pile d'opérandes et un pool de constantes pour identifier la méthode appropriée. Le stack frame est supprimé lorsque la méthode se déroule normalement, c'est-à-dire sans provoquer d'exceptions. Cela signifie que les variables primitives locales telles que boolean, byte, short, char, int, long, float et double sont également intégrées ici, de sorte qu'elles ne sont pas visibles pour le deuxième thread.

Le Tas (heap area)
Le tas est la mémoire allouée où se trouvent toutes les instances de  classe et les  tableaux. Le tas est alloué au démarrage et est partagé entre tous les threads lancés par la JVM. La mémoire allouée est automatiquement récupérée par le processus du système de gestion automatisé, également appelé Garbage Collection (GC). Une variable locale peut contenir une référence à des objets. L'objet référencé est situé dans un tas.

La Zone dediée au méthodes (method area)
La zone dediée aux méthodes est partagée entre tous les threads initiés par la JVM. La zone est allouée au démarrage de la JVM. Il contient des données d'exécution pour chaque classe, telles qu'un pool de constantes, des données de champ et de méthode, le code des constructeurs et des méthodes. Le terme le moins familier est probablement le pool constant (constant pool en anglais). Le pool constant est créé pendant le processus de chargement de la classe dans la zone des méthodes. Il contient les valeurs initiales des constantes de chaîne et primitives, les noms des classes de référence et d'autres données nécessaires pour procéder correctement à la classe chargée, les constantes connues au moment de la compilation et les références de champ qui doivent être résolues au moment de l'execution.

 
Program counter
Le registre du compteur de programme (PC=Program Counter) est une autre zone importante  réservée en mémoire. Il contient une liste des PC  créés. Un PC est créé au début de chaque thread et contient l'adresse de l'instruction actuellement exécutée par un thread spécifique. L'adresse renvoie à la zone de méthode. La seule exception est la méthode native, qui laisse l'adresse indéfinie.

 Native method stack (La pile de méthode native)
Un enregistrement pour une  pile de méthode native est initié pour chaque thread individuel. Sa fonction est de fournir un accès aux méthodes natives via le JNI. Le JNI fonctionne avec les ressources système sous-jacentes. Une mauvaise utilisation peut se transformer en deux états exceptionnels :
La première exception apparaît lorsqu'un thread nécessite plus d'espace de pile. Dans ce cas, une erreur StackOverflowError est levée et le programme plante, exécuté avec un état supérieur à 1.
Le deuxième cas représente une tentative d'ajouter plus d'entrées à la pile. Le programme génère une erreur OutOfMemoryError. Cela est dû à une tentative d'expansion dynamique de l'espace mémoire déjà entièrement alloué. La mémoire est insuffisante et il n'est pas possible d'allouer une nouvelle pile pour le nouveau thread prévu.

Happy coding 


Author: admin
12.02.2023, 18:03
Category: Other
Comments: 0
Views: 637
-

Share

Comments (0)
There are no comments yet.

Leave A Comment
processing...