|
|
|
|
TUTORIEL JAVA |
|
|
|
Expliquez-moi... le fonctionnement de la machine virtuelle Java |
La JVM émule un environnement d'exécution complet et standard, afin d'assurer la portabilité des programmes. Décomposition de ses éléments-clefs.
(25/07/2005) |
|
Un programme Java n'est jamais
réellement lancé par le système d'exploitation, mais se voit
cantonné à un environnement virtuel créé par la machine virtuelle
Java (JVM, pour Java Virtual Machine). Celle-ci est le
coeur même de la plate-forme Java et de son langage. C'est elle
qui fait le lien entre le code compilé (bytecode) et la machine
même - assurant de fait la portabilité des applications Java.
Chaque système d'exploitation majeur dispose de sa propre version
de la JVM, et toutes fonctionnent selon les mêmes principes.
La JVM est un programme qui émule au sein du système d'exploitation
un environnement standardisé, isolé et sécurisé. Dans cet environnement
protégé, le programme se lance dans un environnement natif,
qui se charge de "convertir" ses requêtes au système. La JVM
fait la liaison entre le code Java compilé et le système d'exploitation
(voire les composants même de la machine), créant une couche
d'abstraction identique à celle proposée par la même implémentation
de la JVM sur d'autres systèmes.
Bytecode
En théorie, la JVM n'a de lien avec Java que le nom : la machine
virtuelle elle-même se soucie peu du langage Java, et tout langage
capable de générer du bytecode compatible devrait être en mesure
de l'exploiter. Le bytecode résulte de la compilation du code
source Java (ou autre, donc) en un fichier .class,
qui contient les instructions pour la machine virtuelle, ainsi
que d'autres informations comme une table de symboles (structure
de données).
Le bytecode est donc un code intermédiaire, et le résultat du
compilateur javac. Java n'est pas le premier langage a profiter
de cette idée, Smalltalk, Ocaml et d'autres langages historiques
peuvent en générer. Perl, PHP et Python y font également appel,
tandis que la plate-forme .NET, de son côté, en a fait la base
de son indépendance, tant côté système que langage. De nombreux
langages sont en mesure d'être compilé pour la JVM.
L'environnement virtuel
Le programme en charge de la JVM créé donc un environnement
d'execution complet, prenant en charge la plupart des fonctionnalités
d'un système d'exploitation. La complexité de cette émulation
est répartie dans quatre unités liées : les registres (registers),
la pile (stack), le tas (heap) et la zone de méthodes.
Les registres
La JVM dispose de quatre registres : le premier est un compteur
de programme (pc register) servant à gérer la mémoire,
plus spécifiquement l'emplacement où les instructions devront
être/sont lancées. Cet emplacement correspond au "thread"
en cours.
Les trois autres registres servent à gérer la pile. Chacun pointe
vers le bloc de données utilisé par la méthode en cours d'exécution.
Ce bloc est appelé "stack frame", et correspond à une
zone de la mémoire occupée par le stack.
- registre "optop" : pointe vers le haut de la pile d'opérandes,
- registre "frame" : pointe vers l'exécution en cours,
- registre "vars" : pointe vers la première variable locale
de l'exécution en cours.
La pile
La pile/stack est donc l'endroit où agissent les instruction
bytecode : passage de paramètre et récupération de résultat,
vérification d'état... Chacun invocation de méthode dispose
de sa propre stack frame, vers laquelle pointent les
registres sus-cités.
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Le tas
Le tas correspond à la zone de mémoire où prolifèrent les objets
Java (instanciés à partir du mot-clef new).
C'est aussi ici que sévit le terrible ramasse-miettes, dont
nous avons déjà parlé (lire notre
article du 26/05/05).
La zone de méthode
Enfin, la zone de méthodes héberge les bytescodes eux-mêmes.
Elle dispose de deux sous-zones : méthode et réserve constante
(constant pool).
Ces quatre unités travaillent de concert pour offrir aux applications
Java un environnement sain dans lequel s'exécuter. |
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|