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 que se passe-t-il quand on le met sur false
.
je sais que le système de compilation prend en charge 5 niveaux d'exécution, essentiellement divisé en interpréteur, C1 et C2:
- niveau 0-interprète
- niveau 1 - C1 avec le plein optimisation (sans profilage)
- niveau 2 - C1 avec l'invocation et de l'backedge compteurs
- niveau 3-C1 avec profilage complet (Niveau 2 + MDO)
- niveau 4-C2
deux questions:
(1) par avec le paramètre -XX:-TieredCompilation
, certains de ces niveaux sont-ils simplement désactivés? Si oui, lequel?
(2) Est-il un indicateur pour décider de désactiver C1 ou C2, ou de ne pas compiler?
3 réponses
-XX:-TieredCompilation
désactive l'intermédiaire de la compilation de niveaux (1, 2, 3), de sorte qu'une méthode est soit interprété ou compilé au maximum niveau d'optimisation (C2).
comme effet secondaire TieredCompilation
change également le nombre de threads du compilateur, la Politique de compilation et la taille du cache de code par défaut. Notez qu'avec TieredCompilation
désactivé
- il y aura moins de threads de compilateurs;
- simple compilation la politique (basée sur l'invocation de méthode et les compteurs de backedge) sera choisie au lieu de Advanced compilation policy ;
- la taille par défaut du cache de code réservé sera 5 fois plus petit .
pour désactiver le compilateur C2 et ne laisser que C1 sans frais supplémentaires, régler -XX:TieredStopAtLevel=1
.
pour désactiver tous les compilateurs JIT et exécuter tout dans l'interpréteur, utilisez -Xint
.
il y a différents niveaux de JIT, comme vous l'avez remarqué (y compris ne pas exécuter le JIT du tout).
dans les anciennes versions de Java, vous aviez l'habitude de les sélectionner au début (par ex. -Xint
, -client
, -server
) pour exécuter avec juste l'interpréteur, avec juste le compilateur client (C1), ou juste le compilateur serveur (C2).
Compilation étagée, qui est venu avec Java 7, signifiait que le compilateur hotspot pourrait se déplacer entre ces étapes transparente. Donc ce qui se passe c'est qu'après un certain nombre d'exécution, le code sera compilé avec C1, et ensuite après plus d'exécution, il sera compilé avec C2. C'est sur une base méthode par méthode, donc quand une application exécute une partie significative sera juste exécutée sous interpréteur (qui est pour le code froid) et puis après que le code est exécuté beaucoup (chaud) alors il sera compilé pour ê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 Ne pas faire cette transition, et vous devez sélectionner à l'avance si vous utilisez le client ou le compilateur de serveur. Si vous avez plusieurs processeurs ou une VM 64 bits, alors il utilisera un serveur VM (C2), sinon il utilisera un Client VM (C1).
donc -Xint
s'exécute avec seulement l'interpréteur (c.-à-d. pas de compilateur) et vous pouvez sélectionner soit seulement C1 ou C2 avec -client
ou -server
respectivement, ainsi que le -XX:-TieredCompilation