web-dev-qa-db-fra.com

Pourquoi le code JVM n'est-il pas compilé JVM Cache?

L'implémentation canonique JVM de Sun applique une optimisation assez sophistiquée à Bytecode pour obtenir des vitesses d'exécution quasi natives après que le code a été exécuté plusieurs fois.

La question est de savoir pourquoi ce code compilé n'est-il pas mis en cache sur disque à utiliser lors des utilisations ultérieures de la même fonction/la même classe?

Comme il se trouve, chaque fois qu'un programme est exécuté, le compilateur JIT commence à nouveau, plutôt que d'utiliser une version pré-compilée du code. L'ajout de cette fonctionnalité n'apporterait-il pas un coup de pouce significatif à la période d'exécution initiale du programme, lorsque le bytecode est essentiellement interprété?

106
Chinmay Kanchi

Sans recourir à Cut'N'Pêquez du lien que @Myyn posté, je suppose que cela est dû au fait que les optimisations que les performances JVM ne sont pas statiques, mais plutôt dynamiques, basées sur les modèles de données ainsi que sur les modèles de code. Il est probable que ces modèles de données changent pendant la durée de vie de l'application, ce qui rend les optimisations en cache inférieures à optimales.

Donc, vous auriez besoin d'un mécanisme pour établir si des optimisations sauvegardées étaient encore optimales, à laquelle vous pourriez aussi bien ré-optimiser à la volée.

25
skaffman

JVM d'Oracle est en effet documenté pour le faire - citant Oracle,

le compilateur peut tirer parti du modèle de résolution de la classe Oracle JVM pour persister éventuellement des méthodes compilées Java à travers les appels, les sessions ou les instances de la base de données. Une telle persistance évite les frais généraux des recompilations inutiles entre les sessions ou les instances, lorsqu'il est connu que sémantiquement le code Java n'a pas changé.

Je ne sais pas pourquoi toutes les implémentations sophistiquées VM n'offrent pas d'options similaires.

25
Alex Martelli

Une mise à jour des réponses existantes - Java 8 a un JEP dédié à la résolution de cela:

=> Jep 145: Code compilé de cache. nouveau lien .

À un niveau très élevé, son objectif indiqué est :

Enregistrez et réutilisez le code natif compilé des exécutions précédentes afin d'améliorer l'heure de démarrage des grandes Java Applications.

J'espère que cela t'aides.

14
Eugen

Excelsior Jet a un compilateur JIT de mise en cache depuis la version 2.0, publié en 2001. De plus, son compilateur AOT peut recompiler le cache dans un seul objet DLL/partagé en utilisant tous les optimisations.

5
Dmitry Leskov