studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones java jvm jit

java - reales - ¿Qué hace exactamente-XX:-TieredCompilation?



libro de android studio en español pdf (3)

Usando java -XX:+PrintFlagsFinal Encontré el indicador TieredCompilation , y leí un poco en línea.

Sin embargo, todavía no sé exactamente qué sucede cuando lo configuro como false .

Sé que el sistema de compilación admite 5 niveles de ejecución, básicamente divididos en intérprete, C1 y C2:

  • nivel 0 - intérprete
  • nivel 1 - C1 con optimización completa (sin perfiles)
  • nivel 2 - C1 con invocación y contadores de respaldo
  • nivel 3 - C1 con perfil completo (nivel 2 + MDO)
  • nivel 4 - C2

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

Dos preguntas:

(1) Al establecer -XX:-TieredCompilation , ¿se -XX:-TieredCompilation algunos de estos niveles? En caso afirmativo, ¿cuál?

(2) ¿Hay alguna bandera para decidir si deshabilitar C1 o C2, o no compilar en absoluto?


Como usuario de Java 8, se recomienda deshabilitar TieredComplilation para uso en producción con coma flotante.

Oracle no solucionará este problema en Java8. Todos los puntos de acceso JVM 8 con G1GC tienen el mismo problema.

( Bug1 ) ( Bug2 )


Hay diferentes niveles de JIT, como habrás notado (incluida la no ejecución del JIT).

En versiones anteriores de Java, solía tener que seleccionarlas al principio (por ejemplo, -Xint , -client , -server ) para ejecutarlas solo con el intérprete, solo con el compilador del cliente (C1) o solo el compilador del servidor (C2).

La compilación escalonada, que vino con Java 7, significaba que el compilador de puntos de acceso podía cambiar sin problemas entre esos pasos. Entonces, lo que sucede es que después de una cierta cantidad de ejecuciones, el código se compilará con C1 y luego, después de más ejecuciones, se compilará con C2. Esto se realiza método por método, por lo que cuando una aplicación se está ejecutando, una parte importante solo se ejecutará con un intérprete (que es para el código frío) y luego, después de que el código se ejecute mucho (en caliente), se compilará en ser más eficiente Puede ver los diferentes niveles ejecutando

$ 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)

La -XX:-TieredCompilation es esencialmente TieredCompilation=false que significa que no haga esta transición, y debe seleccionar por adelantado si desea usar el compilador del cliente o del servidor. JVM decide heurísticamente qué modo aplicar en función de su CPU; si tiene varios procesadores o una VM de 64 bits, utilizará una VM de servidor (C2); de lo contrario, utilizará una VM de cliente (C1).

Entonces -Xint se ejecutará solo con el intérprete (es decir, sin compilador) y puede seleccionar C1 o C2 solo con -client o -server respectivamente, junto con -XX:-TieredCompilation


-XX:-TieredCompilation deshabilita los niveles de compilación intermedios (1, 2, 3), de modo que un método se interpreta o se compila en el nivel de optimización máximo (C2).

Como efecto TieredCompilation indicador TieredCompilation también cambia el número de subprocesos del compilador, la política de compilación y el tamaño de caché de código predeterminado. Tenga en cuenta que con TieredCompilation deshabilitado

Para deshabilitar el compilador C2 y dejar solo C1 sin sobrecarga adicional, establezca -XX:TieredStopAtLevel=1 .

Para deshabilitar todos los compiladores JIT y ejecutar todo en el intérprete, use -Xint .