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:
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?
-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é
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
.
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