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 :


Architecture


Comme cité précédemment, HotSpot respecte une architecture multi-couches, dont en voici la structure :


Architecture HotSpot

Nous pouvons voir sur ce shéma que deux compilateurs sont disponibles :


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 :



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 ).


HotSpot ayant été présenté dans les grandes lignes, nous pouvons passer maintenant à la méthodologie à suivre pour écrire un bon microbenchmark en Java.