Machine virtuelle Java - Optimisations JIT

Dans ce chapitre, nous allons découvrir les optimisations JIT.

Inlining de méthode

Dans cette technique d'optimisation, le compilateur décide de remplacer vos appels de fonction par le corps de la fonction. Voici un exemple pour le même -

int sum3;

static int add(int a, int b) {
   return a + b;
}

public static void main(String…args) {
   sum3 = add(5,7) + add(4,2);
}

//after method inlining
public static void main(String…args) {
   sum3 = 5+ 7 + 4 + 2;
}

En utilisant cette technique, le compilateur sauve la machine de la surcharge de tout appel de fonction (il nécessite de pousser et de sauter des paramètres dans la pile). Ainsi, le code généré s'exécute plus rapidement.

L'intégration de méthode ne peut être effectuée que pour les fonctions non virtuelles (fonctions qui ne sont pas remplacées). Considérez ce qui se passerait si la méthode 'add' était remplacée dans une sous-classe et que le type de l'objet contenant la méthode n'est pas connu avant l'exécution. Dans ce cas, le compilateur ne saurait pas quelle méthode insérer. Mais si la méthode était marquée comme "finale", alors le compilateur saurait facilement qu'elle peut être en ligne car elle ne peut être remplacée par aucune sous-classe. Notez qu'il n'est pas du tout garanti qu'une méthode finale soit toujours en ligne.

Élimination du code inaccessible et mort

Un code inaccessible est un code qui ne peut être atteint par aucun flux d'exécution possible. Nous considérerons l'exemple suivant -

void foo() {
   if (a) return;
   else return;
   foobar(a,b); //unreachable code, compile time error
}

Le code mort est également un code inaccessible, mais le compilateur crache une erreur dans ce cas. Au lieu de cela, nous recevons juste un avertissement. Chaque bloc de code tel que les constructeurs, les fonctions, try, catch, if, while, etc., ont leurs propres règles pour le code inaccessible défini dans le JLS (Java Language Specification).

Pliage constant

Pour comprendre le concept de pliage constant, consultez l'exemple ci-dessous.

final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.