web-dev-qa-db-fra.com

Que fait exactement -XX: -TieredCompilation?

En utilisant Java -XX:+PrintFlagsFinal J'ai trouvé le drapeau TieredCompilation et je l'ai lu un peu en ligne.

Pourtant, je ne sais toujours pas exactement ce qui se passe lors du réglage sur false.

Je sais que le système de compilation prend en charge 5 niveaux d'exécution, essentiellement divisés en interprète, C1 et C2:

  • niveau 0 - interprète
  • niveau 1 - C1 avec optimisation complète (pas de profilage)
  • niveau 2 - C1 avec compteurs d'invocation et de backedge
  • niveau 3 - C1 avec profilage complet (niveau 2 + MDO)
  • niveau 4 - C2

Source: http://hg.openjdk.Java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

Deux questions:

(1) En mettant -XX:-TieredCompilation, certains de ces niveaux sont-ils simplement désactivés? Si oui lequel?

(2) Existe-t-il un indicateur pour décider de désactiver C1 ou C2 ou de ne pas compiler du tout?

52
Markus Weninger

-XX:-TieredCompilation désactive les niveaux de compilation intermédiaires (1, 2, 3), de sorte qu'une méthode est interprétée ou compilée au niveau d'optimisation maximal (C2).

En tant qu'effet secondaire, l'indicateur TieredCompilation modifie également le nombre de threads du compilateur, la stratégie de compilation et la taille du cache de code par défaut. Notez que avec TieredCompilation désactivé

  • il y aura moins de threads de compilateur;
  • une politique de compilation simple (basée sur l'invocation de méthode et les compteurs de sauvegarde) sera choisie à la place de politique de compilation avancée ;
  • la taille du cache de code réservé par défaut sera 5 fois plus petite .

Pour désactiver le compilateur C2 et ne conserver que C1 sans surcharge supplémentaire, définissez -XX:TieredStopAtLevel=1.

Pour désactiver tous les compilateurs JIT et tout exécuter dans un interpréteur, utilisez -Xint.

56
apangin

Comme vous l'avez remarqué, il existe différents niveaux de JIT (notamment ne pas exécuter JIT du tout).

Dans les anciennes versions de Java, il fallait d’abord les sélectionner (par exemple, -Xint, -client, -server) Pour fonctionner avec uniquement un interpréteur, avec uniquement le client (C1 ) ou simplement le compilateur serveur (C2).

La compilation à plusieurs niveaux, fournie avec Java 7, permettait au compilateur de points d'accès sans interruption de basculer de manière transparente entre ces étapes. Donc, ce qui se passe, c'est qu'après un certain nombre de cycles, le code sera compilé avec C1, puis après plusieurs autres, il sera compilé avec C2. C’est méthode par méthode. Ainsi, lorsqu’une application est en cours d’exécution, une partie importante de celle-ci est exécutée sous un interpréteur (code froid), puis une fois que le code est exécuté (à chaud), il est ensuite compilé. être plus performant. Vous pouvez voir les différents niveaux en lançant

$ Java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold                     = 0
intx Tier3CompileThreshold                     = 2000
intx Tier4CompileThreshold                     = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)

Le -XX:-TieredCompilation Est essentiellement TieredCompilation=false, Ce qui signifie que vous ne faites pas cette transition et que vous devez sélectionner à l'avance si vous souhaitez utiliser le compilateur client ou serveur. La JVM décide de manière heuristique le mode à appliquer en fonction de votre CPU; si vous avez plusieurs processeurs ou une VM 64 bits, il utilisera un serveur VM (C2), sinon il utilisera un client VM (C1).

Ainsi, -Xint Fonctionnera uniquement avec l'interpréteur (c.-à-d. Sans compilateur) et vous pourrez sélectionner uniquement C1 ou C2 avec -client Ou -server, Ainsi que le -XX:-TieredCompilation

15
AlBlue

En tant qu'utilisateur Java 8, il est recommandé de désactiver TieredComplilation pour une utilisation en production avec une virgule flottante.

Oracle ne résoudra pas ce problème sur Java8. Tous les points d'accès JVM 8 avec G1GC ont le même problème.

( Bug1 ) ( Bug2 )

3
WENPIN1