Benchmarking et Optimisations en Java
JVM HotSpot
Généralités
HotSpot est la JVM officielle de Sun depuis la version 1.3 de Java. Elle en est aujourd'hui à sa version 7, devenue libre.Disponible gratuitement, ses sources et celles du compilateur Javac sont disponibles sous licence GPL depuis fin 2006.
Ces dernières comptent environ 250 000 lignes de codes, majoritairement du C++, agrémentées de quelques morceaux d'assembleur.
La JVM HotSpot est en réalité un package de composants en couche, et comprend donc :
- Un Class Loader
- Un interpréteur de bytecode
- Une VM Client et une VM Serveur
- Des Garbage Collectors
- Un lot de librairies Runtime
Architecture
Comme cité précédemment, HotSpot respecte une architecture multi-couches, dont en voici la structure :

Nous pouvons voir sur ce shéma que deux compilateurs sont disponibles :
- Un compilateur Client, simple compilateur à trois phases, avec peu d'optimisations
- Un compilateur Serveur, plus axé sur les performances à long terme, et qui compile au maximum le code
Par compilateur 3 phases, nous entendons un compilateur qui utilise 2 représentations intermédiaires du code avant de passer au langage machine, HIR (High Intermediate Representation) et LIR(Low Intermediate Representation).
Ces deux compilateurs sont respectivement activés par l''option -client et -server de la JVM, et supportent tous deux la compilation dite Just-In-Time, caractéristique explicitée ultérieurement.
Un environnement d'exécution complet
La particularité offerte par l'utilisation d'une Java Virtual Machine est de disposer d'un environnement d'exécution complet, sécurisé dans ses interactions avec le système d'exploitation. Voyons maintenant donc comment HotSpot gère la mémoire dont il dispose.La gestion de la mémoire est répartie en 4 unités :
- Les registres : ils sont au nombre de 4, il seront détaillés ultérieurement.
- La pile : propre à chaque thread, allouée par le tas et utilisée pour stocker les variables locales, les résultats partiels, et joue un rôle dans l'invocation des méthodes. Chaque méthode en dispose d'une partie, appelée Stack Frame.
- Le tas : zone mémoire partagée entre tous les threads où prolifèrent les objets Java et où sévit donc le Garbage Collector.
- La zone des méthodes : partagée entre tous les threads. Contient le code de la méthode.
- "Runtime Constant Pool" inclus dans la zone des méthodes : il s'agit d'une table des symboles améliorée.
Revenons maintenant sur les quatre registres précédemment cités.
Le premier est pc register, il s'agit d'un compteur de programme, chaque thread en possède un. Il pointe sur l'instruction en cours d'exécution.
Les trois autres registres servent à gérer la pile, chacun pointe vers le bloc de données utilisée par la méthode en cours d'exécution ( le Stack Frame ).
- optop pointe vers le haut de la pile d'opérandes.
- frame pointe vers l'exécution en cours.
- vars pointe vers la première variable locale.
HotSpot ayant été présenté dans les grandes lignes, nous pouvons passer maintenant à la méthodologie à suivre pour écrire un bon microbenchmark en Java.