Máquina virtual Java: niveles de compilación

JVM admite cinco niveles de compilación:

  • Interpreter
  • C1 con optimización completa (sin creación de perfiles)
  • C1 con contadores de invocación y back-edge (perfiles ligeros)
  • C1 con perfilado completo
  • C2 (utiliza datos de creación de perfiles de los pasos anteriores)

Use -Xint si desea deshabilitar todos los compiladores JIT y usar solo el intérprete.

Cliente vs servidor JIT

Utilice -client y -server para activar los modos respectivos.

El compilador del cliente (C1) comienza a compilar el código antes que el compilador del servidor (C2). Entonces, para cuando C2 haya comenzado la compilación, C1 ya habrá compilado secciones de código.

Pero mientras espera, C2 perfila el código para saber más sobre él que el C1. Por lo tanto, el tiempo que espera si se compensa con las optimizaciones se puede utilizar para generar un binario mucho más rápido. Desde la perspectiva de un usuario, la compensación es entre el tiempo de inicio del programa y el tiempo que tarda en ejecutarse. Si el tiempo de inicio es lo más importante, entonces se debe usar C1. Si se espera que la aplicación se ejecute durante mucho tiempo (típico de las aplicaciones implementadas en servidores), es mejor usar C2 ya que genera un código mucho más rápido que compensa en gran medida cualquier tiempo de inicio adicional.

Para programas como IDE (NetBeans, Eclipse) y otros programas de GUI, el tiempo de inicio es crítico. NetBeans puede tardar un minuto o más en iniciarse. Se compilan cientos de clases cuando se inician programas como NetBeans. En tales casos, el compilador C1 es la mejor opción.

Tenga en cuenta que hay dos versiones de C1: 32b and 64b. C2 viene solo en64b.

Compilación escalonada

En versiones anteriores de Java, el usuario podría haber seleccionado una de las siguientes opciones:

  • Intérprete (-Xint)
  • C1 (-cliente)
  • C2 (-servidor)

Llegó en Java 7. Utiliza el compilador C1 para iniciarse y, a medida que el código se calienta, cambia al C2. Se puede activar con las siguientes opciones de JVM: -XX: + TieredCompilation. El valor predeterminado esset to false in Java 7, and to true in Java 8.

De los cinco niveles de compilación, la compilación por niveles utiliza 1 -> 4 -> 5.