[Java] Compilation à la volée et disparition de stack traces

java.png

En parcourant un blog technique, je suis tombé sur un article ayant retenu mon attention. Il était question du compilateur JIT Java et de sa capacité à faire disparaître la stack trace des exceptions levées.

Avant toute chose, un petit rappel. Le compilateur JIT (Just-In-Time compiler, en français compilateur à la volée) est un programme intégré à la JVM qui transforme, durant l'exécution d'une application, du bytecode en instructions pouvant être exécutées directement par le processeur (code natif). Cela permet de gagner en performances et se traduit, notamment, par une exécution plus rapide. Ce compilateur est inclus dans la JVM Hot Spot depuis la version 1.2 de Java.

Mais le compilateur JIT ne se contente pas de transformer du bytecode en code natif, il réalise aussi des optimisations qui peuvent être troublantes causant, par exemple, la disparition de stacktraces. Pour preuve, exécutez le code suivant :

for (int i = 0; i < 50000; i++) {
  try {
    args[0].toString();
  } catch (Exception e) {
    if (e.getStackTrace().length == 0) {
      System.out.format("Disparition de  la stacktrace à l'itération n°%d", i);
      break;
    }
  }
}

Sur ma machine, équipée de la JDK7, la stack trace disparait à l'itération n°12288.

La raison tient du fait que la création d'exceptions est un processus coûteux. Pour des questions de performances, lorsqu'une exception est levée un certain nombre de fois, il arrive que le compilateur JIT recompile la méthode. Après la recompilation, le compilateur choisit une stratégie plus rapide utilisant des exceptions pré-allouées qui ne fournissent pas de stack trace.

Il est possible de désactiver complètement l'utilisation des exceptions pré-allouées en utilisant le flag -XX:-OmitStackTraceInFastThrow au démarrage de la JVM.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.