Saltar a contenido

GraalVM JIT

1. Introduccion

En estapas anteriores JAVA era un lenguaje que ofrecia portabilidad, ya que su secreto era compilar un codigo estandar en un bytecode que las distintas JVM podrian interpretar en distintos entornos.

Los interpretes en runtime se han ido actualizando y mejorando a lo largo del tiempo, esto es lo que nos lleva a los dias de hoy donde GraalVM se ha convertido en un interprete revolucionario.

1.1 JIT (Just in Time) Compiler

Una vez las aplicaciones son compiladas, las JVM ejecutan el codigo, pero a su vez incluyen 2 compiladores que se ejecutan en runtime para mejorar la eficiencia del programa, por eso se llaman Just in Time (JIT)

Los 2 compiladores Just In Time (JIT) que traen por defecto las JVM son C1 (llamado client compiler) y C2 (llamado server-compiler o tambien opto)

C1 no se preocupa tanto de la optimizacion en runtime por lo tanto a priori es un compilador que permite una ejecucion mas rapida inicialmente . Es el compilador activado por defecto en las HotSpot. Son ideales para aplicaciones standalone (Desktop applications).

C2 se preocupa mas por la optimizacion del codigo y tambien por el analisis de las invocaciones en runtime, permitiendo una mejora identificando patrones de llamada. Puede llegar a generar bytecode mas optimizado que C++.

Consideraciones. Al igual que cuando el garbage collector actua, la vm realiza una pausa, lo mismo ocurre con los compiladores JIT. Por lo que cada optimizacion nos penalizara momentaneamente, de ello dependera cuando elegir uno u otro.

Cuando usar uno u otro

El C2 (server) tiene mas sentido en aplicaciones que van a correr mucho tiempo y merece la pena la optimizacion del codigo aunque penalice al principio ya que a la larga nos dara mas ventajas

1.2 GraalVM (super JIT compiler)

GraalVM es un proyecto de Oracle basado en JIT, que tambien tiene la particularidad de que es multilenguaje (Java; JavaScript, Ruby, Python, R, C/C++ …).

JIT MODE

Ofrece en runtime los ya conocidos C1 y C2 JIT compilers pero mas actualizados, pero a parte nos ofrece JVMCI (Java Virtual Machine Compiler Interface) que ofrece una optimizacion distinta ya que ese compilador trabaja de una manera mas eficiente. Para usarlo basta con indicarlo en el arranque:

-XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler

AOT MODE (Ahead Of Time)

Este modo es capaz de compilar nuestro codigo de una manera eficiente y especifica para un determinado entorno, es decir genera una imagen nativa utilizando el gcc destino y generando por lo tanto la mayor de las optimizaciones posibles. Esta compilacion es antes de la ejecucion (Ahead Of Time), por lo que en este modo nuestra aplicacion si quiere ser portable necesita compilarse nuevamente con el gcc destino.

Desventajas al tener un codigo precompilado, tenemos que tener en cuenta cosas que usamos en programacion que aunque GraalVM es capaz de respetarlas, si que no las optimizará o seran propensas a problemas. El uso del API Reflections es el mas representativo en este aspecto.

Cuando usar uno u otro

La compilacion mediante AOT nos ofrecerá un startup inmediato lo cual le hace indispiensable para entornos serverless y tambien nos ofrece un gran rendimiento en long time running applications.