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
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?
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
- habrá menos hilos de compilación;
- se elegirá una política de compilación simple (basada en la invocación de métodos y contadores de respaldo) en lugar de una política de compilación avanzada ;
- El tamaño predeterminado de caché de código reservado será 5 veces más pequeño .
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
.