Ce schèma vient du site anglais javatbrains.blogspot.com
On peut découper ce schéma en 4 grandes zones
Class Loader Subsystem
Runtime Data Areas
Execution Engine
Native Interface
OS
On va les analyser dans l’ordre logique d’exécution.
Il faut bien comprendre qu’une application Java sera exécutée dans n’importe quel environnement, mais, étant donné que la JVM, JRE et JDK sont tous dépendants de la plate-forme. L’affichage (fenêtres, design, boutons, listes,…) pour Linux, unix, mac, solaris ou Windows sera différent.
Rôle : Il charge les fichiers .class en mémoire. Il charge les classes déjà compilées par le compilateur javac qui n’est pas intégré à la JVM.
.class
javac
Étapes internes :
Important : La JVM ne charge pas tout au démarrage, elle charge les classes à la demande.
Nous avons :
C’est la mémoire de travail de la JVM.
Elle contient :
C’est la mémoire des définitions.
Elle contient tous les objets créés avec le mot-clé new.
tous les objets créés avec le mot-clé new
Exemple :
Client client123 = new Client();
L’objet client123 de type Client ira dans le Heap.
Heap
Le Heap est partagé entre tous les threads (processus) que nous ne détaillerons pas ici.
Chaque thread possède sa propre pile. En fait, c’est dans cette pile que seront stockés les données et variables des méthodes.
int nombre = 10;
nombre est stockée dans la stack.
nombre
Chaque thread (processus) possède un PC Register. Il indique quelle instruction est en train d’être exécutée.
On peut le comparer cela au Program Counter d’un processeur. Ce sont les registres qui contiennent les adresses mémoire des instructions des méthodes. S’il y a 2 méthodes, 2 registres seront utilisés pour suivre les instructions des méthodes.
Utilisé quand Java appelle du code natif (C/C++).
System.arraycopy(...)
Certaines méthodes sont implémentées en natif.
C’est le moteur d’exécution.
Interpreter : Il lit le bytecode instruction par instruction.
Interpreter
Inconvénient : plus lent
JIT Compiler
Si une méthode est appelée souvent : Elle est compilée en code machine natif.
Intérêt : Très rapide et optimisé pour la machine locale
C’est ce qui rend Java performant.
Cela permet d’appeler du code écrit en C/C++ et d’accéder à des bibliothèques système (Native method interface ↔ Native method libraries).
JNI = Java Native Interface.
Operating System (OS) sur lequel la JVM tourne. Le JIT génère du code machine adapté à cet OS.
JIT
La JVM est une couche intermédiaire qui :
C’est elle qui rend Java portable !
Et voici un schéma simplifié du processus :