L'implémentation JVM canonique de Sun applique une optimisation assez sophistiquée au bytecode pour obtenir des vitesses d'exécution quasi-natives après que le code a été exécuté plusieurs fois.
La question est, pourquoi ce code compilé n'est-il pas mis en cache sur le disque pour une utilisation lors des utilisations ultérieures de la même fonction / classe?
Dans l'état actuel des choses, chaque fois qu'un programme est exécuté, le compilateur JIT démarre à nouveau, plutôt que d'utiliser une version précompilée du code. L'ajout de cette fonctionnalité n'ajouterait-il pas une augmentation significative de la durée d'exécution initiale du programme, lorsque le bytecode est essentiellement interprété?
Réponses:
Sans recourir au cut'n'paste du lien que @MYYN a posté, je soupçonne que c'est parce que les optimisations effectuées par la 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, rendant les optimisations mises en cache moins qu'optimales.
Vous auriez donc besoin d'un mécanisme pour déterminer si les optimisations enregistrées étaient toujours optimales, à quel point vous pourriez tout aussi bien ré-optimiser à la volée.
la source
La JVM d'Oracle est en effet documentée pour le faire - citant Oracle,
Je ne sais pas pourquoi toutes les implémentations sophistiquées de VM n'offrent pas d'options similaires.
la source
Une mise à jour des réponses existantes - Java 8 a un JEP dédié à résoudre ce problème:
=>
JEP 145: Code compilé en cache. Nouveau lien .À un niveau très élevé, son objectif déclaré est :
J'espère que cela t'aides.
la source
Excelsior JET dispose d'un compilateur JIT de mise en cache depuis la version 2.0, publiée en 2001. De plus, son compilateur AOT peut recompiler le cache en un seul objet DLL / partagé en utilisant toutes les optimisations.
la source
Je ne connais pas les raisons réelles, n'étant aucunement impliqué dans l'implémentation de la JVM, mais je peux penser à quelques-unes plausibles:
Mais je devine vraiment, et comme vous pouvez le voir, je ne pense pas vraiment qu'aucune de mes raisons ne soit de véritables bouchons. Je pense que Sun ne considère tout simplement pas ce support comme une priorité, et peut-être que ma première raison est proche de la vérité, car cela pourrait aussi amener les gens à penser que les fichiers de classe Java ont vraiment besoin d'une version séparée pour chaque VM au lieu d'être multiplateforme.
Ma méthode préférée serait en fait d'avoir un traducteur de bytecode vers natif séparé que vous pourriez utiliser pour faire quelque chose comme ça explicitement à l'avance, en créant des fichiers de classe qui sont explicitement construits pour une VM spécifique, avec éventuellement le bytecode d'origine en eux afin que vous peut également fonctionner avec différentes VM. Mais cela vient probablement de mon expérience: j'ai surtout fait Java ME, où ça fait vraiment mal que le compilateur Java ne soit pas plus intelligent en matière de compilation.
la source