Post on 29-Mar-2021
M3105 Conception et programmation
objet avancéesJVM
Thomas NowakUniversité Paris-Saclay
Machines non-virtuelles
ALU
R1 R2
R1
add R1, R2
else if(strncmp(op, "add", OP_LEN) == 0) { int *op1 = find_reg(arg1); int *op2 = find_reg(arg2); int *res = op1; *res = *op1 + *op2; program_counter++; } else if(strncmp(op, "sub", OP_LEN) == 0) { int *op1 = find_reg(arg1);
Machines virtuelles
ALU
R1 R2
R1
add R1, R2add R1, R2
Machines virtuelleselse if(strncmp(op, "add", OP_LEN) == 0) { int *op1 = find_reg(arg1); int *op2 = find_reg(arg2); int *res = op1; *res = *op1 + *op2; program_counter++; } else if(strncmp(op, "sub", OP_LEN) == 0) { int *op1 = find_reg(arg1);
Runtime• runtime = environnement d’exécution de code
• implémente le modèle de calcul du langage de programmation
• ex : C calling conventions
• passage de paramètres/valeurs de retour, caller/callee saved registers
• ex : interpreter Python
• ex : machine virtuelle Java
Java Virtual Machine (JVM)• machine virtuelle conçue pour exécuter Java
• spécification qui laisse ouvert qq détails
• implémentations pour plusieurs systèmes d’exploitation
• but : indépendance du système
• exécute le bytecode Java qui est produit par le compilateur de Java (javac)
• JVM de Oracle : HotSpot (écrite en C++)
Java Virtual Machine (JVM)
Fichiers .class• .java → javac → .class
• 1 classe par fichier .class, plusieurs fichiers .class générés si plusieurs classes dans un fichier .java
• contenu :
• magic word
• constantes, champs, méthodes
• méta-données
• afficher les instructions d’une classe : javap -c NomDeLaClasse
Machines à pile
pile
op1
op2
iadd
pile
op1+op2
Machines à pile
pileiload_0
pile
loc. var #0
Machines à pile
pileistore_0
pile
val
Machines à pileint i;
i = 1;
++i;
iconst_1 istore_0 iload_0 iconst_1 iadd istore_0
Types de la JVM
• référence (à un objet ou un tableau)
• int (32 bit)
• long (64 bit)
• float (32 bit)
• double (64 bit)
Instructions de la JVM• instructions typées
• arithmétiques : iadd, isub, fadd, fsub, …
• load/store : iload, astore, …
• conversions : i2s, i2l, i2d, …
• création/manipulation d’objets : new, getfield, …
• manipulation directe de pile : swap, dup, …
• conditionnels, sauts : ifeq, goto, …
• invocations de méthodes : invokevirtual, invokestatic, …
Passage de paramètres
Objets dans la JVM
Langages JVM• JVM exécute du bytecode, pas nécessairement produit à partir d’un
fichier .java
• d’autres langages qui produisent du Java bytecode :
• Groovy
• Scala
• JRuby, Jython
• Kotlin
• Clojure
Multi-méthodes et langages dynamiques
• instruction normale pour appeler des méthodes : invokevirtual
• dépend du type dynamique de l’objet (dynamic dispatch)
• mais ne dépend pas des types dynamiques des paramètres (car Java n’a pas de multi-méthodes)
• la JVM (après version 7) contient une instruction pour dépendre des types dynamiques des paramètres : invokedynamic
• permet d’implémenter des langages dynamiques (plus facilement)
Interprétation, JIT, AOT
• les premières JVM ont interprété le bytecode instruction par instruction
• JVM modernes : compile des méthodes souvent utilisées
• lors de l’exécution : just-in-time (JIT) compilation
• à partir de Java 9 : ahead-of-time (AOT) compilation possible
Pile vs tas• variables/constantes dans la pile : implicitement détruits
au retour d’une méthode (pop du stack frame)
• variables/constantes dans le tas : destruction n’est pas implicite, car pas d’ordre temporel des objets dans le tas
• source importante d’erreurs en C++ : gestion d’objets dans le tas, en particulier oubli de détruire (memory leak)
• alternative de gestion manuelle : garbage collection automatique par le runtime
Garbage collection• garbage collection = identification et destruction
automatique d’objets qui ne seront plus utilisés
• mécanisme de base : identification d’objets qui ne sont plus accessibles à partir des références actives
• choix important du moment de la collection
• but : éviter de bloquer l’exécution du programme
• défi supplémentaire : fragmentation de la mémoire
Reference counting• idée : on compte le nombre de références à chaque objet
• si compte = 0, alors détruire l’objet
• utilisé dans les shared_ptr en C++
• la destruction d’un objet peut (transitivement) provoquer la destruction d’un grand nombre d’autres objets ; problématique si destruction immédiate
• problème de références cycliques
Mark-and-Sweep• mark : calcul de l’ensemble des successeurs dans le
graphe dirigé des objets et leurs références
• sweep : destruction de tous les objets qui ne sont pas marqués
• moment de l’exécution de la collection :
• stop-the-world
• concurrent
Générations
• observation : la plupart des objets a une durée de vie très limitée
• idée : séparation entre objets jeunes et vieux ; création dans la jeune génération, puis copie dans la vieille génération après un certain temps
• peut diminuer la fragmentation
JVM
• JVM = machine virtuelle pour indépendance du système d’exploitation
• machine à pile
• utilisée par d’autres langages
• tous les objets et tableau dans le tas
• garbage collection