1. Comme mentionnédanslapremière partie de cette série d’articlessurlaJVM,le bytecode
généré parun compilateurstatique,estchargé dans laJVMgrâce aux chargeursde classe.
Ensuite,leditcode écritenlangage intermédiaire noncompréhensible parle microprocesseur,
estinterprété ligneparligne parl’interpréteurqui faitpartie de l’architecture de laJVM,ledit
code est transformé encode assembleurpourêtre reconnuparle microprocesseur,puisen
2. code machine,pourêtre enfinexécuté.Cependant,pendantl’exécution,laJVMcompte le
nombre de foisqu’uncode estexécuté,si elle constate l’appel fréquentd’uncode,celui-ci est
éligible àlacompilation parlaJIT (Jus-In-Time Compiler) qui estuncompilateurdynamique
faisantaussi partie de laJVM. Dans cetarticle,nousallons parlerdesrôlesde l’interpréteuret
du compilateurJITdansle processusd’exécutionducode chargé dansla JVM.
I-L’interpréteur
L’interpréteurimplémentédansHotspot(JVMoracle) est basé surun Template.
L’implémentation d’uninterpréteur peutse faire soitenmode Templatecomme c’estle casde
Hotspotou enmode switchcase dans une boucle,lesdeux modesontdesavantagesetdes
inconvénients que nousn’allonspas détaillerdanscetarticle.
Pendantle démarrage de laJVM,celle-ci génèreenmémoire l’interpréteur enutilisantdes
informations stockées dansuntemplate appeléTemplateTable.Cette structure de donnée
contientle mappingentre chaque instructionde bytecode etl’instruction dédiéeàchaque type
de machine.La JVMfournitaussi desaccesseurssousforme de fonctionspour accéderau
contenudu TemplateTable.
Après le chargementdubytecode,le code n’estpas compilé immédiatement,ceci pourdeux
raisons :
La première raison, estlafréquence d’exécutionducode.Eneffet,si uncode estappelé une fois
il n’estdoncpas nécessaire de le compiler,il serait beaucoupplusjudicieux qu’une
interprétationsoitfaite pouréviterune consommationde ressourcesinutiles,carcompilerdu
code exécuté une seulefoisnécessite plusieurscycles processeur, cependant, le prix àpayer,
estla lenteurd’exécution. End’autresmotsle code interprétéest moinsrapide dansl’exécution
que le code compilé.
La deuxième raisonc’estl’optimisation.Uncode fréquemmentexécuté permetàlaJVMde
glanerdesinformationsqu’elleutiliserapendantlacompilation aux finsd’optimisation.
Afind’illustrernospropos,prenonsune méthodefairequelqueChose() qui estdéfiniedansune
classe X,héritée etredéfinieparune autre classe Y, lorsde l’appel de celle-ci surune instance de
Y (y1. fairequelqueChose()),laJVMva faire une recherche(lookup) sur l’appelde ladite
méthode afinde déterminerlaméthode de laclasse à exécuter.Parle mécanismede
polymorphisme, fairequelqueChose()de Yva être exécutée. Ce processus (recherche –
exécution(interprétation)) vase répétertantaussi longtemps que le code n’estpas compilé.
Après plusieurs exécutions,laJVMva pouvoirglanerdes informationssurladite méthodeetse
rendre compte que fairequelqueChose()estappeléparl’instance de Y. Cesinformationsseront
ensuite utiliséespendantlaphase de compilation.LaJVMva optimisersonprocessusen
éliminantl’étapede recherche,ce qui vapermettre àlaJVMde gagnerencélérité dansson
processus.
3. Figure 1
Il existe danslaJVM5 niveaux de compilationqui représententl’étatde compilationd’uncode
dans laJVM :
Niveau0 : Code interprété
Niveau1 : C1 (compilateurclient) code compilé simplifié
Niveau2 : C1 (Compilateurclient) code compilé limité
Niveau3 : C1 (Compilateurclient) code compilé enentier
Niveau4 : C2 (Compilateurserveur) code compilé
Comme nouspouvonsle constater,le code interprété estauniveau0.Il représente le tout
premierétatd’uncode chargé dans la JVMpendantl’exécution.Il estànoterque toutcode
4. chargé dansla JVMcommence auniveau0 avant de poursuivre sonchemindansune file de
compilation. Nousconstatonségalementqu’il existe deuxtypesde compilateurdanslaJVM, le
compilateurclient C1et le compilateurserveurC2.
II-Compilateur
Pendantl’exécution d’une méthode, laJVMétablit2compteurs,1 pour lafréquence d’appelde
ladite méthode etundeuxième pourchaque branchement de laboucle,si laméthode contient
une boucle.Cesdeux compteurssontdonc comparés àune variable paramétrable :
CompileThreshold.Cette variable pardéfautdansle compilateurclientest1500 etpour le
compilateurserveurest10000. Elle peutfaire partie des paramètres de calibrage de laJVMen
indiquant:-XX :compileThreshold=N etN représente le nombre de fois nécessaire pourqu’un
code soitappelé afind’ être éligible àune compilation.
Le compilateurJITexisteendeux types,le client etle serveur.DanslaJVM,ilssont appelés
respectivementcompilateurC1etcompilateurC2. Pour l’utilisation,il fautmentionner la
commande –clientou –server dans le calibrage de laJVM, enpassantces variablesdansles
argumentsd’exécution de laJVM.
La différence entreles2typesde compilateurs estlaréactivité face aucode à compiler,le
compilateurclientestbeaucoupplusrapide danslacompilationau débutde l’exécution que le
compilateurserveur.Enrevanche,le compilateurC2(serveur) vaproduire une meilleure
optimisationque le compilateurC1.Ce qui implique un certaingain entermesde rapidité
d’exécution ducode compilé parC2.
Depuislaversion7 de java,il existe une autre forme de compilation,qui utilise lesdeux typesde
compilateurscomme levier.Appelée TieredCompilation,etparamétrée aulancementde laJVM
aveccet argument–XX :+TieredCompilation ,elle permetde profiterde lacéléritéde
compilation ducode compilé de C1au démarrage de l’exécution etde laqualité d’optimisation
du code compilé parC2.
Dans le processusde compilation,laJVMutilise une ressource appeléecode cache qui lui
permetd’optimisersonprocessus.Lataille de cette structure aune incidence surla quantité du
code à compiler. Elle permetàlaJVMd’y stocker certaines instructions enassembleurà
utiliserpourlacompilation.Ayantune taillepardéfaut,ellepeuttoutde même être calibrée en
utilisantcette commande :-XX:ReservedCodeCacheSize=N ,N étant lataille ducode cache.
Lorsque la JVMconstate qu’uncode est éligible àlacompilation,il le metdansune file
d’attente,ensuite selonlapriorité qui estétablieparle nombre d’appelsduditcode,il estdonc
acheminé versle compilateur.
Pourvisualiserleslogsde compilations,il fautcalibrerlaJVMavec cette argument –
XX :+PrintCompilation.