2011-10-21 2 views
14

Dans une conférence sur JIT dans Hotspot, je veux donner autant d'exemples que possible des optimisations spécifiques que JIT effectue.Optimisations Jots Hotspot

Je ne connais que la "méthode inline", mais il devrait y en avoir beaucoup plus. Donnez un vote pour chaque exemple.

Répondre

13

Eh bien, vous devriez scanner les articles de Brian Goetz pour des exemples.

En bref, HotSpot peut et:

  1. méthodes inline
  2. Rejoignez synchronized adjacents blocs sur le même objet
  3. Éliminez les verrous si le moniteur n'est pas accessible à partir d'autres threads
  4. Éliminer le code mort (donc la plupart des micro-benchmarks sont insensibles)
  5. Ecriture de mémoire morte pour non volatile variables
  6. Remplacer les appels d'interface avec la méthode directe nécessite des méthodes uniquement mis en œuvre une fois

et ainsi de suite

2

Passe au code machine natif équivalent au lieu de l'interprétation JVM des codes op. L'absence de besoin de simuler une machine (la JVM) en code machine pour une partie fortement utilisée d'une application Java (qui est l'équivalent d'une extension de la JVM) offre une bonne augmentation de la vitesse.

Bien sûr, c'est l'essentiel de ce qu'est HotSpot.

4

Il existe une vue d'ensemble ancienne mais probablement encore valide dans this article.

Les faits saillants semblent effectuer des optimisations classiques en fonction des informations de profilage d'exécution disponibles:

  • JITting « points chauds » dans le code natif
  • Adaptive inline - inline les implémentations les plus communément appelées pour une expédition de méthode donnée pour éviter une énorme taille de code

Et certains mineurs comme GC générationnel qui rend l'allocation d'objets de courte durée moins cher, et diverses autres optimisations plus petites, plus tout ce qui était ad depuis que cet article a été publié.

Il y a aussi un official whitepaper plus détaillé, et un HotSpot Internals wiki page assez grossier qui indique comment écrire du code Java rapide qui devrait vous permettre d'extrapoler les cas d'utilisation qui ont été optimisés.

10

Il y a une grande présentation sur les optimisations utilisées par JVMs modernes sur le site Jikes RVM: ACACES’06 - Dynamic Compilation and Adaptive Optimization in Virtual Machines

Il traite de l'architecture, des compromis, des mesures et des techniques. Et nomme au moins 20 choses que les JVM font pour optimiser le code machine.

+0

Un grand! Merci et +1. – alf

+4

Semble être mort, essayez http://www.complang.tuwien.ac.at/andi/ACACES06.pdf – user60561

7

Je pense que les choses intéressantes sont les choses qu'un compilateur conventionnel ne peut pas faire contrairement au JIT. Inlining méthodes, éliminant le code mort, CSE, analyse en direct, etc.Tout est fait par votre compilateur C++ moyen, rien de "spécial" ici

Mais optimiser quelque chose en se basant sur des hypothèses optimistes et ensuite les désoptimiser plus tard s'ils s'avèrent faux? (en supposant un type spécifique, en supprimant les branches qui échoueront plus tard si ce n'est pas fait, ..) Enlever les appels virtuels si on peut garantir qu'il n'existe qu'une seule classe en ce moment (encore quelque chose qui fonctionne de façon fiable avec la désoptimisation)? L'optimisation adaptative est, je pense, la seule chose qui distingue vraiment le JIT de votre compilateur C++. Peut-être aussi mentionner le profilage d'exécution effectué par le JIT pour analyser quelles optimisations il devrait appliquer (ce n'est plus aussi unique avec toutes les optimisations guidées par le profil).